FFmpeg extract clip - частота кадров потока отличается от частоты кадров контейнера (x264, aac)

8

Резюме
Похоже, что видео H.264 имеет действительно высокую частоту кадров, для которой требуется коэффициент масштабирования, применяемый к продолжительности видео, которое я пытаюсь извлечь (в 900 раз ниже).

Тело
Я пытаюсь извлечь клип из фильма, который у меня есть в формате MP4 (созданный с помощью Handbrake ). Попробовав mencoder и VLC, я решил попробовать FFmpeg, поскольку это было наименее хлопотно, когда дело дошло до копирования кодеков. То есть, по сравнению с mencoder и VLC, полученный файл все еще воспроизводился в QuickTime (я знаю о Perian и т. Д., Я просто пытаюсь узнать, как все это работает).

Во всяком случае, моя команда была следующей:

ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

Во время копирования появляется следующее:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
  Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
    Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size=    8144kB time=101.60 bitrate= 656.7kbits/s
…

Вместо клипа продолжительностью 5:59 я получаю всю оставшуюся часть фильма. Итак, чтобы проверить это, я запустил команду ffmpeg -t 00:00:01. Я получил ровно 15-минутный клип. Поэтому я немного поработал над черным ящиком и решил масштабировать свой -tвариант, рассчитав, какое значение ввести, учитывая, что 1 секунда интерпретировалась как 900 с. Для моего желаемого клипа 359 с я рассчитал 0,399 с, и моя команда ffmpeg стала такой:

ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

Это работает, но я понятия не имею, почему продолжительность масштабируется на 900. При дальнейшем исследовании каждый прогон ffmpeg имеет строку:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)

45000/25 = 1800. Должно быть где-то отношение. Почему-то неприлично высокая частота кадров вызывает проблемы с синхронизацией. Как эта частота кадров так высока? Самое приятное в этом то, что результирующий clip.mp4 имеет точно такую ​​же функцию (из-за скопированного видеокодека), и для извлечения дополнительных клипов из этого необходимо такое же масштабирование для параметра -tпродолжительности. Поэтому, я сделал это доступным для любого желающего проверить это.

Приложение
Преамбула для ffmpeg в моей системе (построена с использованием порта ffmpeg MacPorts):

FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    1. 4. 0 /  1. 4. 0
  libswscale     1. 7. 1 /  1. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Jan  4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)

РЕДАКТИРОВАТЬ
Не уверен, была ли это ошибка или нет, но, похоже, сейчас она исправлена ​​в моей текущей версии ffmpeg, по крайней мере, для этого видео (версия 0.6.1 от MacPorts).

fideli
источник
Повторное кодирование не является решением, и выполнение расшифровки в течение пяти минут для контента в течение пяти минут нецелесообразно и, вероятно, не решит основную проблему. Отличное начальное исследование, кстати. Вы, вероятно, правы, полагая, что обнаружение fps ffmpeg является причиной вашей проблемы. Похоже, более поздняя версия ffmpeg исправила вашу проблему, но я сделаю комментарий. Я бы порекомендовал сделать копию -c в другом формате контейнера. Это может иметь различные эффекты, но это был бы хороший следующий шаг для экспериментов.
dstob

Ответы:

1

С ffmpeg расположение опций имеет значение. В вашем примере он пытается применить -ss и -t к входным данным. Используйте его следующим образом: параметры будут применяться к выходным данным:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

С текущим ffmpeg правильный синтаксис будет:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4
evilsoup
источник
1

У меня была такая же проблема, и мое решение было следующее:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec ('ffmpeg -y -i /testmedia/'.$info['filename']. '-vf fps = fps = 1 /'.$ fracduration.' -f image2 /testmedia/images/output%03d.jpg 2 > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

Это дает мне 10 изображений для всего видео, независимо от длины видео

Гас
источник