2016-07-22 39 views
1

我正在編碼h264 mp4,並與第一幀輸出字節大小與所有其他幀有一個小問題。沒有幀重複發生,而只是第一幀總是以其他幀的字節大小的兩倍。我的用例要求第一幀與其他幀相比非常相似。FFmpeg第一幀字節大小超過所有其他幀的2倍大小 - w/100%關鍵幀

這裏是ffmpeg的編碼參數:

ffmpeg -framerate 60 -i "C:\Test%4d.jpg" -c:v libx264 -g 1 -vf "scale=3840:2160" -crf 19 -pix_fmt yuv420p C:\Test.mp4 

而且邊框細節使用ffprobe:

ffprobe C:\Test.mp4 -show_frames -of compact -show_entries frame=pict_type,pkt_size 

ffprobe version N-79143-g8ff0f6a Copyright (c) 2007-2016 the FFmpeg developers 
    built with gcc 5.3.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmfx --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. 19.100/55. 19.100 
    libavcodec  57. 30.100/57. 30.100 
    libavformat 57. 29.101/57. 29.101 
    libavdevice 57. 0.101/57. 0.101 
    libavfilter  6. 40.102/6. 40.102 
    libswscale  4. 0.100/4. 0.100 
    libswresample 2. 0.101/2. 0.101 
    libpostproc 54. 0.100/54. 0.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\users\dusti\downloads\Test.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf57.29.101 
    Duration: 00:00:00.17, start: 0.000000, bitrate: 240225 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p, 3840x2160 [SAR 9:16 DAR 1:1], 240662 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default) 
    Metadata: 
     handler_name : VideoHandler 
frame|pkt_size=1377043|pict_type=I 
frame|pkt_size=406953|pict_type=I 
frame|pkt_size=407200|pict_type=I 
frame|pkt_size=406647|pict_type=I 
frame|pkt_size=405276|pict_type=I 
frame|pkt_size=404715|pict_type=I 
frame|pkt_size=403226|pict_type=I 
frame|pkt_size=401806|pict_type=I 
frame|pkt_size=400750|pict_type=I 
frame|pkt_size=400189|pict_type=I 

我已經證實,它不是由文件,轉換與ffprobe只是一個報告問題mp4box:

mp4box.exe -dash 16.666 -frag 16.666 -rap c:\Test.mp4 

它返回一個MPD文件:

<Initialization range="0-922"/> 
     <SegmentURL mediaRange="923-1378146" indexRange="923-966"/> 
     <SegmentURL mediaRange="1378147-1785280" indexRange="1378147-1378190"/> 
     <SegmentURL mediaRange="1785281-2192661" indexRange="1785281-1785324"/> 
     <SegmentURL mediaRange="2192662-2599489" indexRange="2192662-2192705"/> 
     <SegmentURL mediaRange="2599490-3004946" indexRange="2599490-2599533"/> 
     <SegmentURL mediaRange="3004947-3409842" indexRange="3004947-3004990"/> 
     <SegmentURL mediaRange="3409843-3813249" indexRange="3409843-3409886"/> 
     <SegmentURL mediaRange="3813250-4215236" indexRange="3813250-3813293"/> 
     <SegmentURL mediaRange="4215237-4616167" indexRange="4215237-4215280"/> 
     <SegmentURL mediaRange="4616168-5016537" indexRange="4616168-4616211"/> 
    </SegmentList> 

我試着編碼一個虛擬的黑色框架,它確實似乎解決了這個問題,但我真的不希望這樣做。這裏的幀大小與第一架換成了純黑色邊框:

frame|pkt_size=2173|pict_type=I 
frame|pkt_size=466255|pict_type=I 
frame|pkt_size=430179|pict_type=I 
frame|pkt_size=416652|pict_type=I 
frame|pkt_size=411401|pict_type=I 
frame|pkt_size=407174|pict_type=I 
frame|pkt_size=405377|pict_type=I 
frame|pkt_size=403207|pict_type=I 
frame|pkt_size=401588|pict_type=I 
frame|pkt_size=401200|pict_type=I 

人對如何控制這種行爲任何線索?我想這可能與CRF質量算法有關,但真的不知道。任何幫助,將不勝感激。

感謝, 達斯汀

更新16年7月22日 在多一點挖,我可以看到的ffmpeg使用較低的QP第一幀:

[libx264 @ 05380b60] frame= 0 QP=14.92 NAL=3 Slice:I Poc:0 I:32400 P:0 SKIP:0 size=1485053 bytes 
[libx264 @ 05380b60] frame= 1 QP=29.48 NAL=3 Slice:I Poc:0 I:32400 P:0 SKIP:0 size=361196 bytes 
[libx264 @ 05380b60] frame= 2 QP=29.48 NAL=3 Slice:I Poc:0 I:32400 P:0 SKIP:0 size=359406 bytes 

但我還沒有找到一種方法來避免這種行爲。我試着將qpmin/qpmax設置爲非默認值,但這並沒有改變任何東西。根據我下面的評論,兩遍編碼不會表現出這種行爲。仍然在尋找一種不使用這個大型初始幀的CRF編碼方式。

+0

它似乎編碼與兩遍VBR確實避免了這種行爲。雖然我更願意使用CRF編碼來保持質量不變。 –

+0

恆定速率因子(CRF)將根據幀中發生的情況調整幀的QP - 以非常簡單的方式,當只有很少的動作或移動時,它將降低QP並丟棄更多,從而獲得更小的數據包。它的定義很大程度上會給你一個非恆定的幀大小。你的經驗表明,即使允許這個第一幀非常大嗎? – Mick

+0

@米克,第一幀和第二幀在內容上幾乎相同,所以應該沒有理由在QP中有這樣的差異。雖然我當然可以理解這僅僅是CRF算法的一個必要的小錯誤,它不應該經常關心那個單一的第一幀。 –

回答

1

一劈解決方法是分割輸出,即與僞幀編碼在CRF模式下的視頻前面,然後斬它關閉即

ffmpeg -i test.mp4 -ss 0.016 -c copy test1.mp4 

在這裏,SS值< = 1/framerate。由於這是一個內部編碼流,這是一個精確的分割。