2016-07-22 134 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。由于这是一个内部编码流,这是一个精确的分割。