Я использую код на основе Live555 / openRTSP для потоковой передачи видеоисточника H.264 в файл mp4 и хотел бы одновременно прочитать предыдущие части файла (из другого приложения). Изменение fopen
быть fid = _fsopen(fileName, "wb", _SH_DENYWR)
(из OutputFile.cpp) явно недостаточно, потому что это не имеет значения, и медиаплееры все равно не откроют его (это строка записи для вывода mp4?)
Что касается примечания, если я имитирую нечистое завершение работы программного обеспечения (например, сбой питания), незаконченные файлы не читаются никакими медиапроигрывателями. Я предполагаю, что то, что записано в файл при закрытии файла, позволяет медиаплееру понять файл. Это также ситуация, для которой я хотел бы, если возможно, написать код, и вполне вероятно, что это действительно та же проблема, что и выше?
Любые указатели / ответы / мысли очень получили 🙂
Вы обычно не читаете из MP4
(то же самое верно для многих других форматов) файлов, использующих fopen
-подобный API, и вместо этого вы используете библиотеки. Который, в свою очередь, ожидает завершенный файл и не пытается восстановить поврежденный файл или читать файл, который все еще записывается.
Таким образом, хотя технически можно читать, пока он еще пишется, вы вряд ли преуспеете в этом с обычными библиотеками, приложениями и проигрывателями. Сначала необходимо завершить запись, чтобы сделать файл допустимым, читаемым и воспроизводимым, поскольку на шаге завершения записываются индексы, необходимые для воспроизведения.
На случай, если кому-то понадобится то же самое, я так и сделал, и это оказалось проще, чем я предполагал:
fopen
в OutputFile.cpp для вызова совместного использования файлов _fsopen
QuickTimeFileSink::continuePlaying()
функция, которую я вызываю completeOutputFile()
, таким образом, поддерживая заголовок в актуальном состоянии (с продолжительностью видео и т. д.).Проигрывателю Windows Media это не нравилось (вероятно, он пытался получить эксклюзивный доступ к файлу), но VLC был очень рад прочитать файл, пока я все еще в него направлялся.