題 FFmpeg提取剪輯 - 流幀速率與容器幀速率不同(x264,aac)


摘要
H.264視頻似乎具有非常高的幀速率,需要應用於我試圖提取的視頻持續時間的縮放因子(低900倍)。

身體
我正在嘗試從MP4格式的電影中提取剪輯(使用 手剎)。在嘗試了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:00分鐘的剪輯。所以我做了一些黑盒工程並決定擴展我的 -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的序言(使用MacPorts ffmpeg端口構建):

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)

編輯
不確定它是否是一個bug,但它現在似乎已在我當前版本的ffmpeg中得到修復,至少對於這個視頻(來自MacPorts的版本0.6.1)。


8
2018-01-09 21:34


起源


重新編碼不是一種解決方案,在5分鐘的內容中進行數小時的解碼是不合理的,並且可能無法解決潛在的問題。偉大的初步研究btw。假設fps ffmpeg檢測到的是您問題的根源,您可能是正確的。這聽起來像ffmpeg的更高版本修復了你的問題,但我會發表評論。我本來建議做一個-c複製到不同的容器格式。這可以產生各種各樣的效果,但這將是一個很好的下一步試驗。 - dstob


答案:


使用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
2017-12-20 06:06





我遇到了同樣的問題,我的解決方案如下:

        $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張圖像


1
2018-01-23 17:13