2017-08-08 224 views
1

我使用avcodec(C++)api來解碼視頻文件幀並處理它們。我注意到解碼幀數小於預期的\實際幀數。差別是16幀。 雖然x幀使用ffmpeg解碼,但VirtualDub說同一個文件有x + 16幀。使用ffprobe ,我看到的是,文件中包含X展架:ffmpeg解碼器似乎丟幀

$ ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 inputFile.avi 
10875 

而且,當我嘗試使用的ffmpeg程序提取X + 1幀,我得到了一個錯誤:

$ ffmpeg -i inputFile.avi -vf "select=eq(n\,10875)" -vframes 1 outPic.jpg 
ffmpeg version N-80801-gc0cb53c Copyright (c) 2000-2016 the FFmpeg developers 
    built with gcc 5.4.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib 
    libavutil  55. 27.100/55. 27.100 
    libavcodec  57. 48.101/57. 48.101 
    libavformat 57. 40.101/57. 40.101 
    libavdevice 57. 0.102/57. 0.102 
    libavfilter  6. 46.102/6. 46.102 
    libswscale  4. 1.100/4. 1.100 
    libswresample 2. 1.100/2. 1.100 
    libpostproc 54. 0.100/54. 0.100 
Input #0, avi, from 'inputFile.avi': 
    Metadata: 
    comment   : Recorder-v2 
    encoder   : Lavf57.40.101 
    Duration: 00:18:09.10, start: 0.000000, bitrate: 3421 kb/s 
    Stream #0:0: Video: mpeg4 (Simple Profile) (xvid/0x64697678), yuv420p, 1280x960 [SAR 1:1 DAR 4:3], 3420 kb/s, 10 fps, 10 tbr, 10 tbn, 10 tbc 
[swscaler @ 00000000021100a0] deprecated pixel format used, make sure you did set range correctly 
[image2 @ 0000000001f10540] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead. 
Output #0, image2, to 'outPic.jpg': 
    Metadata: 
    comment   : Recorder-v2 
    encoder   : Lavf57.40.101 
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 1280x960 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 10 fps, 10 tbn, 10 tbc 
    Metadata: 
     encoder   : Lavc57.48.101 mjpeg 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 
Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg4 (native) -> mjpeg (native)) 
Press [q] to stop, [?] for help 
frame= 0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x 
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown 
Output file is empty, nothing was encoded (check -ss/-t/-frames parameters if used) 

有趣和怪異的部分是,節省這部電影的所有幀中產生的序列x + 16個文件(相同幀號VirutalDub索賠):

$ ffmpeg -i inputFile.avi "frames/out-%03d.jpg" 
ffmpeg version N-80801-gc0cb53c Copyright (c) 2000-2016 the FFmpeg developers 
    built with gcc 5.4.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib 
    libavutil  55. 27.100/55. 27.100 
    libavcodec  57. 48.101/57. 48.101 
    libavformat 57. 40.101/57. 40.101 
    libavdevice 57. 0.102/57. 0.102 
    libavfilter  6. 46.102/6. 46.102 
    libswscale  4. 1.100/4. 1.100 
    libswresample 2. 1.100/2. 1.100 
    libpostproc 54. 0.100/54. 0.100 
Input #0, avi, from 'inputFile.avi': 
    Metadata: 
    comment   : Recorder-v2 
    encoder   : Lavf57.40.101 
    Duration: 00:18:09.10, start: 0.000000, bitrate: 3421 kb/s 
    Stream #0:0: Video: mpeg4 (Simple Profile) (xvid/0x64697678), yuv420p, 1280x960 [SAR 1:1 DAR 4:3], 3420 kb/s, 10 fps, 10 tbr, 10 tbn, 10 tbc 
[swscaler @ 00000000020600a0] deprecated pixel format used, make sure you did set range correctly 
[image2 @ 0000000001d20540] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead. 
Output #0, image2, to 'frames/out-%03d.jpg': 
    Metadata: 
    comment   : Recorder-v2 
    encoder   : Lavf57.40.101 
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 1280x960 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 10 fps, 10 tbn, 10 tbc 
    Metadata: 
     encoder   : Lavc57.48.101 mjpeg 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 
Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg4 (native) -> mjpeg (native)) 
Press [q] to stop, [?] for help 
frame=10891 fps=120 q=24.8 Lsize=N/A time=00:18:09.10 bitrate=N/A dup=16 drop=0 speed= 12x 
video:384325kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown 

計數的數量的文件/幀:

$ ls -l frames/* | wc -l 
    10891 

我幾乎迷失在這裏。任何線索爲什麼avcodec解碼x幀而不是x + 16? ffmpeg錯過了幀? VirtualDub可能是重複的(16)幀?

感謝

+0

此視頻是否有純黑色框架? – VTT

+0

不是我所知道的 –

回答

0

可能的原因是「丟幀」,你可以用VirtualDub的熱鍵檢查這個「開始 - >下一步丟幀」。 FFmpeg不會將它們計算爲獨立幀,但您可以注意到時間碼中的跳轉。

+0

是的,這就是它! 看起來像Vdub「完成」掉幀,通過填寫最後一幀的副本。 此外,ffmpeg可以在轉儲所有幀時模仿此行爲: ffmpeg -i inFile.avi「%03d.jpg」 –

+0

有沒有人知道使用avcodec(C++)api來告訴ffmpeg以填充重複幀的方式,洞「,就像virtualDub?例如,在ffmpeg實用程序中,可以使用'-vsync cfr'開關創建但我需要在我的解碼C++代碼中執行它 謝謝 –

+0

afaik沒有簡單的開關。您可以觀察點中的差距並自行插入重複項。順便說一句,這是在我的基於ffmpeg的驅動程序中爲virtualdub實現的https://sourceforge.net/p/vdfiltermod/cch_input/ci/master/tree/ – shekh