Flash 使用ffmpeg生成具有完全相同关键帧位置的多个分辨率

Flash 使用ffmpeg生成具有完全相同关键帧位置的多个分辨率,flash,ffmpeg,flv,Flash,Ffmpeg,Flv,关于如何使用ffmpeg将X转换为Y等等,有很多参考资料,但我似乎无法使用相同的关键帧和帧位置生成同一文件的不同分辨率 关键帧位置很重要,因为它们允许玩家从一个比特率跳到另一个比特率 这些视频是为Flash设计的 我一直从验证工具中得到这样的结果 failed on frame 1670 [FrameInfo 1670, type 9, timecode 23565, seekable 1670] [FrameInfo 1670, type 9, timecode 23565, seekable

关于如何使用ffmpeg将X转换为Y等等,有很多参考资料,但我似乎无法使用相同的关键帧和帧位置生成同一文件的不同分辨率

关键帧位置很重要,因为它们允许玩家从一个比特率跳到另一个比特率

这些视频是为Flash设计的

我一直从验证工具中得到这样的结果

failed on frame 1670
[FrameInfo 1670, type 9, timecode 23565, seekable 1670]
[FrameInfo 1670, type 9, timecode 23565, seekable 1525]
更糟糕的是,有时需要重新排序帧

failed on frame 1
[FrameInfo 1, type 9, timecode 0, seekable 1]
[FrameInfo 1, type 8, timecode 0, seekable -1]
当尝试验证随Adobe Flash Media Server安装的示例视频时,它们是正常的

Comparing files
0: G:\VOD\sample1_150kbps.flv
1: G:\VOD\sample1_500kbps.flv
2: G:\VOD\sample1_700kbps.flv
3: G:\VOD\sample1_1500kbps.flv
Index, Keyframes, and Timecodes are Validated across all files
示例
ffmpeg
命令我以不同的分辨率运行。Adobe Media Encoder也在制作具有不同关键帧位置的视频,所以我不知道这里发生了什么

ffmpeg -i source.mp4 -vf scale=1270:720 -c:a copy output.flv
ffmpeg 720p

ffmpeg -i .\big_buck_bunny_1080p_surround.avi -vf scale=1280:720 -vcodec libx264 -profile:v main -acodec libvo_aacenc -b:a 128k -ac 2  big_buck_bunny_720.flv
ffmpeg -i .\big_buck_bunny_1080p_surround.avi -vf scale=854:480 -vcodec libx264 -profile:v main -acodec libvo_aacenc -b:a 128k -ac 2  big_buck_bunny_480.flv
ffmpeg 480p

ffmpeg -i .\big_buck_bunny_1080p_surround.avi -vf scale=1280:720 -vcodec libx264 -profile:v main -acodec libvo_aacenc -b:a 128k -ac 2  big_buck_bunny_720.flv
ffmpeg -i .\big_buck_bunny_1080p_surround.avi -vf scale=854:480 -vcodec libx264 -profile:v main -acodec libvo_aacenc -b:a 128k -ac 2  big_buck_bunny_480.flv
ffmpeg控制台输出

ffmpeg version N-59433-g4aa9c91 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec 29 2013 22:01:53 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfi
g --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopenco
re-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 59.100 / 52. 59.100
  libavcodec     55. 47.100 / 55. 47.100
  libavformat    55. 22.100 / 55. 22.100
  libavdevice    55.  5.102 / 55.  5.102
  libavfilter     4.  0.103 /  4.  0.103
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from '.\big_buck_bunny_1080p_surround.avi':
  Metadata:
    encoder         : AVI-Mux GUI 1.17.7, Aug  8 2006  20:59:17
    JUNK            :
  Duration: 00:09:56.46, start: 0.000000, bitrate: 12455 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 24 tbr, 24 tb
n, 24 tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), fltp, 448 kb/s
File 'big_buck_bunny_720.flv' already exists. Overwrite ? [y/N] Y
[libx264 @ 029deec0] using SAR=1/1
[libx264 @ 029deec0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 029deec0] profile Main, level 3.1
[libx264 @ 029deec0] 264 - core 140 r2377 1ca7bb9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.or
g/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_thr
eads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 r
c=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, flv, to 'big_buck_bunny_720.flv':
  Metadata:
    JUNK            :
    encoder         : Lavf55.22.100
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 1k tbn, 2
4 tbc
    Stream #0:1: Audio: aac (libvo_aacenc) ([10][0][0][0] / 0x000A), 48000 Hz, stereo, s16, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> libx264)
  Stream #0:1 -> #0:1 (ac3 -> libvo_aacenc)
Press [q] to stop, [?] for help
frame=14315 fps= 73 q=-1.0 Lsize=  120952kB time=00:09:56.49 bitrate=1661.1kbits/s
video:110887kB audio:9321kB subtitle:0 global headers:0kB muxing overhead 0.619082%
[libx264 @ 029deec0] frame I:151   Avg QP:17.09  size:115286
[libx264 @ 029deec0] frame P:5374  Avg QP:21.41  size: 14154
[libx264 @ 029deec0] frame B:8790  Avg QP:25.91  size:  2284
[libx264 @ 029deec0] consecutive B-frames: 11.5% 15.5% 13.3% 59.7%
[libx264 @ 029deec0] mb I  I16..4: 24.0%  0.0% 76.0%
[libx264 @ 029deec0] mb P  I16..4:  4.0%  0.0%  3.5%  P16..4: 29.3% 11.1%  7.1%  0.0%  0.0%    skip:45.1%
[libx264 @ 029deec0] mb B  I16..4:  0.2%  0.0%  0.4%  B16..8: 22.4%  1.7%  0.4%  direct: 0.8%  skip:74.1%  L0:37.5% L1:5
8.0% BI: 4.5%
[libx264 @ 029deec0] coded y,uvDC,uvAC intra: 51.5% 64.4% 37.6% inter: 7.3% 10.1% 1.3%
[libx264 @ 029deec0] i16 v,h,dc,p: 40% 23%  9% 28%
[libx264 @ 029deec0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 18% 15%  7%  8% 10%  7%  7%  6%
[libx264 @ 029deec0] i8c dc,h,v,p: 51% 21% 17% 10%
[libx264 @ 029deec0] Weighted P-Frames: Y:5.9% UV:3.6%
[libx264 @ 029deec0] ref P L0: 62.4% 16.9% 15.2%  5.3%  0.1%
[libx264 @ 029deec0] ref B L0: 89.3%  9.1%  1.7%
[libx264 @ 029deec0] ref B L1: 94.3%  5.7%
[libx264 @ 029deec0] kb/s:1522.96
验证结果

Comparing files
0: G:\VOD\big_buck_bunny_480.flv
1: G:\VOD\big_buck_bunny_720.flv
>> Comparison failed on frame 13181
0: [FrameInfo 13181, type 9, timecode 185958, seekable 12794]
1: [FrameInfo 13181, type 9, timecode 185958, seekable 13181]

首先,获取更新版本的ffmpeg,尤其是在更新版本中,会有定期更改,您可以使用算法强制关键帧,例如

 -force_key_frames 'expr:gte(t,n_forced*2)'
这将强制每2秒生成一个关键帧,这是非常频繁的,并且仅在将视频分割为2秒片段时使用,例如在MPEG-DASH配置文件中使用

此外,这里还有一个我编写的小脚本,可以检查生成视频上的关键帧对齐情况。

我发现答案是使用双通道编码。在第一个过程中,ffmpeg在两个文件中创建日志文件和关键帧信息。我只是将输出传递给/dev/null。然后以不同的比特率运行pass2多次。生成的视频文件应具有关键帧对齐

ffmpeg -i "input.avi" -pass 1 -movflags +faststart -aspect 1280:720 -s 1280x720 -profile:v "high" -level "4.0" -c:v libx264 -b:v 5000k -threads 0 -f rawvideo -an -y /dev/null && \

ffmpeg -i "input.avi" -pass 2 -movflags +faststart -aspect 1280:720 -s 1280x720 -profile:v "high" -level "4.0" -c:v libx264 -b:v 5000k -threads 0 -y output_5000_720p.mp4

ffmpeg -i "input.avi" -pass 2 -movflags +faststart -aspect 1280:720 -s 1280x720 -profile:v "high" -level "4.0" -c:v libx264 -b:v 2500k -threads 0 -y output_2500_720p.mp4
对于基于windows的ffmpeg,请使用NUL而不是/dev/null


这种方法使编码器能够调整I帧的位置,以适应突然的场景差异,而不是“手铐”在没有看到您的代码> FFMPEG命令和完整的<代码> FFMPEG控制台输出编辑的情况下,我们如何提出建议?我也尝试设置<代码> -G 90 < /代码>,看看它是否会修复关键帧间隔,它没有。控制台输出丢失。来自Adobe Media Encoder的批处理-计算机在另外2个半小时内无用。它们只有15分钟。我试图避免长编码,但似乎需要这么长的时间。
ffmpeg
中的
-t
选项可用于限制输出持续时间。我将很快尝试进行测试。动态GOP大小始终是首选,以节省播放时的带宽,因此这将是一个更好的解决方案。是的,这是首选…但是,请注意,最好使用第一遍使用的最高比特率。较低带宽版本的压缩效率有所下降,但将提供最佳的总体质量。