Допустим, я запускаю работу FFmpeg, которая занимает часы и часы:
$ ffmpeg -i large.mp4 out.mp4
Есть ли способ, которым я могу просмотреть готовая часть из out.mp4, а остальное еще не закодировано?
Попытка этого жалуется "moov атом не найден". Если я хочу поразмышлять, почему, это произошло бы потому, что для воспроизведения требуется, чтобы обновленная и правильная информация заголовка присутствовала в начале файла, а FFmpeg не пытается делать это при кодировании файлов; он ждет, пока он полностью не закончится.
Ответы:
Проще говоря, нет. Файлы MP4 нельзя просмотреть, пока они не закончили кодирование. Как вы правильно определили, чтобы начать воспроизведение, игроку необходимо проанализировать
moov
атом, который содержит важную информацию о том, что должно быть сыграно. Для описания, вы можете взглянуть на Спецификация формата файла QuickTime , которая стала основой для MPEG-4 Part 14, или коротко, формата MP4.Этот атом может быть записан только после полного кодирования дорожек мультимедиа. Дело не в том, что ffmpeg «не удосуживается» написать его - нужно просто подождать, пока все данные будут там, чтобы получить всю необходимую информацию.
Затем атом записывается в конце контейнера. Для более быстрого воспроизведения вы можете переместить этот атом в начало файла (например, используя
qt-faststart
или с опцией ffmpeg-movflags +faststart
). Это, конечно, также можно сделать только после завершения кодирования.Тем не менее, фрагментированные MP4 могут быть просмотрены до определенного момента, как предполагает Гьян , добавив следующую опцию:
То, что вы также можете сделать, это переключиться на сегментированный метод кодирования, например, с использованием
segment
мультплексор , Они создают частичные клипы до заранее определенной длины, что означает, что вы можете начать предварительный просмотр существующих сегментов. Затем вы можете позже объединить сегменты обратно в один файл с потоковым копированием.источник