Я пытаюсь найти решение для приложения. У меня большой видеофайл. У меня есть, например, 2 или 3 облака, которые недостаточно велики для его хранения. Итак, я хочу разделить этот файл и поместить каждую часть в другое облако, а затем иметь возможность передавать его как единое целое. У меня есть несколько условий:
Я должен иметь возможность вернуть исходный файл до последнего бита. Преобразование возможно, если это условие соблюдается
Я должен иметь возможность потокового разделения файлов как один.
- Это может быть, например, при объединении частей
- Или если разделение совместимо с видеопроигрывателем, воспроизводимым как один.
До сих пор я пытался:
преобразовать в mpeg-ts с помощью ffmpeg и затем разбить двоичный файл. Таким образом, каждая часть доступна для чтения видеоплеером. Это не сработало для меня, потому что, когда я перехожу из mpeg-ts в исходный формат, у меня всегда есть несколько укусов больше. Таким образом, файл не идентичен исходному.
Я разделил двоичный файл. Файл идентичен, когда сливается обратно. Но
- Части не читаются по отдельности видеоплеером
- Я не могу найти способ для потоковой передачи правильно при объединении. Если я создаю файл с файловым потоком, добавляю каждую часть в цикле и использую этот файл в качестве источника для потоковой передачи. Каждый раз, когда я добавляю новую часть, видео начинается с начала.
Это пример функции, которую я использую для объединения файла после простого двоичного разбиения:
bool Output = false;
try
{
string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.tmp");
FileStream outPutFile = null;
string PrevFileName = "";
foreach (string tempFile in tmpfiles)
{
string fileName = Path.GetFileNameWithoutExtension(tempFile);
string baseFileName = fileName.Substring(0, fileName.IndexOf(Convert.ToChar(".")));
string extension = Path.GetExtension(fileName);
if (!PrevFileName.Equals(baseFileName))
{
if (outPutFile != null)
{
outPutFile.Flush();
outPutFile.Close();
}
outPutFile = new FileStream(SaveFileFolder + "\\" + baseFileName + extension, FileMode.OpenOrCreate, FileAccess.Write);
}
int bytesRead = 0;
byte[] buffer = new byte[1024];
FileStream inputTempFile = new FileStream(tempFile, FileMode.OpenOrCreate, FileAccess.Read);
while ((bytesRead = inputTempFile.Read(buffer, 0, 1024)) > 0)
outPutFile.Write(buffer, 0, bytesRead);
inputTempFile.Close();
// File.Delete(tempFile);
PrevFileName = baseFileName;
}
outPutFile.Close();
lblSendingResult.Text = "Files have been merged and saved at location d:\\";
}
catch (Exception ex)
{
throw ex;
}
return Output;