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

时间:2014-09-04 16:47:44

标签: flash ffmpeg flv

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

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

这些视频适用于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 480p

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]

2 个答案:

答案 0 :(得分:3)

首先获得更新版本的ffmpeg,特别是在较新版本中会有常规更改,您可以使用算法强制关键帧,例如

 -force_key_frames 'expr:gte(t,n_forced*2)'

这将每2秒强制一个关键帧,这是非常频繁的,只有当你把视频分成2秒片段时才会使用,例如在MPEG-DASH配置文件中使用。

此外,这是一个我编写的小脚本,可以检查生成视频上的关键帧对齐是预期的。 https://gist.github.com/sinkers/4d02b0c57843dbc6d191

答案 1 :(得分:0)

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

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帧放置,以调整突然的场景差异,而不是将其“手动”到设定的GOP大小和关键帧间隔。