Разделить двоичный файл видеофайла и затем передать все части как один - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь найти решение для приложения. У меня большой видеофайл. У меня есть, например, 2 или 3 облака, которые недостаточно велики для его хранения. Итак, я хочу разделить этот файл и поместить каждую часть в другое облако, а затем иметь возможность передавать его как единое целое. У меня есть несколько условий:

  1. Я должен иметь возможность вернуть исходный файл до последнего бита. Преобразование возможно, если это условие соблюдается

  2. Я должен иметь возможность потокового разделения файлов как один.

    • Это может быть, например, при объединении частей
    • Или если разделение совместимо с видеопроигрывателем, воспроизводимым как один.

До сих пор я пытался:

  1. преобразовать в mpeg-ts с помощью ffmpeg и затем разбить двоичный файл. Таким образом, каждая часть доступна для чтения видеоплеером. Это не сработало для меня, потому что, когда я перехожу из mpeg-ts в исходный формат, у меня всегда есть несколько укусов больше. Таким образом, файл не идентичен исходному.

  2. Я разделил двоичный файл. Файл идентичен, когда сливается обратно. Но

    • Части не читаются по отдельности видеоплеером
    • Я не могу найти способ для потоковой передачи правильно при объединении. Если я создаю файл с файловым потоком, добавляю каждую часть в цикле и использую этот файл в качестве источника для потоковой передачи. Каждый раз, когда я добавляю новую часть, видео начинается с начала.

Это пример функции, которую я использую для объединения файла после простого двоичного разбиения:

        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...