gpt4 book ai didi

video - 与所有其他帧相比,FFmpeg 第一帧字节大小超过 2 倍 - 带 100% 关键帧

转载 作者:行者123 更新时间:2023-12-04 23:00:08 24 4
gpt4 key购买 nike

我正在对 h264 mp4 进行编码,并且在第一帧的输出字节大小与所有其他帧之间存在一个小问题。没有发生帧重复,而只是第一帧总是最终是其他帧字节大小的 2 倍左右。我的用例要求第一帧的大小与其他帧非常相似。

以下是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

通过使用 mp4box 转换文件,我已经确认这不仅仅是 ffprobe 的报告问题:
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 质量算法有关,但真的不知道。任何帮助,将不胜感激。

谢谢,
达斯汀

2016 年 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 编码的方法。

最佳答案

一种解决方法是拆分输出,即在 CRF 模式下对视频进行编码,并在前面使用虚拟帧,然后将其切断,即

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

这里的 ss 值 <= 1/framerate .因为这是一个帧内编码流,所以这是一个精确的分割。

关于video - 与所有其他帧相比,FFmpeg 第一帧字节大小超过 2 倍 - 带 100% 关键帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38532700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com