Предварительный просмотр полуконвертированного видеофайла

1

Допустим, я запускаю работу FFmpeg, которая занимает часы и часы:

$ ffmpeg -i large.mp4 out.mp4

Есть ли способ, которым я могу просмотреть готовая часть из out.mp4, а остальное еще не закодировано?

Попытка этого жалуется "moov атом не найден". Если я хочу поразмышлять, почему, это произошло бы потому, что для воспроизведения требуется, чтобы обновленная и правильная информация заголовка присутствовала в начале файла, а FFmpeg не пытается делать это при кодировании файлов; он ждет, пока он полностью не закончится.

forthrin
источник
Требуется ли использование контейнера MP4?
dsstorefile1
@ dsstorefile1: В качестве выходного контейнера предпочтительнее использовать MP4, поскольку это обеспечивает мгновенную совместимость с портативными устройствами Apple, а также предварительный просмотр в MacOS. Я предполагаю, что вы намекаете на MKV, который я попробовал сейчас, и могу подтвердить, что позволяет мгновенно просматривать себя во время конвертации (в VLC). Но вопрос стоит за MP4.
forthrin
Вы могли бы взглянуть на тройник глушитель ,
llogan
@llogan: Очень хороший совет! Спасибо! Тем не менее, это заставляет вас воспроизводить фильм на протяжении всего преобразования; Вы не можете «вскочить и вылезти» из просмотра его по своему усмотрению.
forthrin

Ответы:

2

Проще говоря, нет. Файлы MP4 нельзя просмотреть, пока они не закончили кодирование. Как вы правильно определили, чтобы начать воспроизведение, игроку необходимо проанализировать moov атом, который содержит важную информацию о том, что должно быть сыграно. Для описания, вы можете взглянуть на Спецификация формата файла QuickTime , которая стала основой для MPEG-4 Part 14, или коротко, формата MP4.

Этот атом может быть записан только после полного кодирования дорожек мультимедиа. Дело не в том, что ffmpeg «не удосуживается» написать его - нужно просто подождать, пока все данные будут там, чтобы получить всю необходимую информацию.

Затем атом записывается в конце контейнера. Для более быстрого воспроизведения вы можете переместить этот атом в начало файла (например, используя qt-faststart или с опцией ffmpeg -movflags +faststart ). Это, конечно, также можно сделать только после завершения кодирования.

Тем не менее, фрагментированные MP4 могут быть просмотрены до определенного момента, как предполагает Гьян , добавив следующую опцию:

-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov

То, что вы также можете сделать, это переключиться на сегментированный метод кодирования, например, с использованием segment мультплексор , Они создают частичные клипы до заранее определенной длины, что означает, что вы можете начать предварительный просмотр существующих сегментов. Затем вы можете позже объединить сегменты обратно в один файл с потоковым копированием.

slhck
источник
Возможный иш: video.stackexchange.com/q/18177/1871
Gyan
1
Хороший и хорошо написанный ответ. PS! Если вы знаете внутреннюю работу форматов: поскольку неполные файлы MKV воспроизводятся из коробки, в то время как файлы MP4 должны быть завершены вместе с этим «атомным» элементом, можно ли считать это ненужным и плохим дизайнерским решением в MP4? PPS! Я бы сказал, что вопрос является дубликатом указанной ссылки, поэтому не стесняйтесь пометить его как таковой.
forthrin
1
@forthrin Да, это не очень надежный дизайн. Фактически, много раз файлы повреждаются во время записи, если, например, камера выключается, прежде чем записать атомы moov. Дубликаты могут быть помечены только на одном сайте, поэтому мы мало что можем сделать, но хорошо, если вопрос останется здесь.
slhck