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 duration. Поэтому, я сделал это доступным для любого желающего проверить это.

аппендикс
Преамбула для 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).

2 ответа2

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
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 изображений для всего видео, независимо от длины видео

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .