我正在编码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编码方式。
它似乎编码与两遍VBR确实避免了这种行为。虽然我更愿意使用CRF编码来保持质量不变。 –
恒定速率因子(CRF)将根据帧中发生的情况调整帧的QP - 以非常简单的方式,当只有很少的动作或移动时,它将降低QP并丢弃更多,从而获得更小的数据包。它的定义很大程度上会给你一个非恒定的帧大小。你的经验表明,即使允许这个第一帧非常大吗? – Mick
@米克,第一帧和第二帧在内容上几乎相同,所以应该没有理由在QP中有这样的差异。虽然我当然可以理解这仅仅是CRF算法的一个必要的小错误,它不应该经常关心那个单一的第一帧。 –