如何使用ffmpeg转换1080 @ 50i-> 720 @ 50p?


9

我真的很喜欢50fps的视频,但是我无法将ffmpeg转换为50fps。

720p分辨率对我来说绝对不错,只需要更多的FPS。

50i在合适的播放器中看起来更加流畅(例如,GOM Player对视频进行隔行扫描并以50Hz的频率播放。与25Hz的视频有很大的差异。)...

我当前的命令行是:

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi

以下是更多视频详细信息。源视频来自Cannon HF10 AVCHD camcoder。

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi
ffmpeg version N-37541-g670229e Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb  3 2012 20:14:17 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
  libavutil      51. 37.100 / 51. 37.100
  libavcodec     54.  0.102 / 54.  0.102
  libavformat    54.  0.100 / 54.  0.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
[h264 @ 000000000033FA30] Increasing reorder buffer to 1
Input #0, mpegts, from '00010.MTS':
  Duration: 00:03:13.92, start: 0.482156, bitrate: 16304 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1
080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, s16,
256 kb/s
File 'output.avi' already exists. Overwrite ? [y/N] y
w:1920 h:1080 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[yadif @ 0000000003CE95B0] mode:0 parity:-1 auto_enable:0
[scale @ 0000000003CE9550] w:1920 h:1080 fmt:yuv420p -> w:1280 h:720 fmt:yuv420p
 flags:0x4
Output #0, avi, to 'output.avi':
  Metadata:
    ISFT            : Lavf54.0.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DA
R 16:9], q=2-31, 20000 kb/s, 50 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb
/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=   15 fps=  0 q=2.0 size=     945kB time=00:00:00.62 bitrate=12481.3kbits/
frame=   32 fps= 32 q=2.0 size=    2132kB time=00:00:01.30 bitrate=13435.2kbits/
frame=   51 fps= 34 q=2.0 size=    3372kB time=00:00:02.06 bitrate=13409.2kbits/
frame=   70 fps= 35 q=2.0 size=    4641kB time=00:00:02.82 bitrate=13482.8kbits/
frame=   76 fps= 35 q=2.0 Lsize=    5047kB time=00:00:03.06 bitrate=13511.9kbits

你是什​​么意思,“做不到”?它给你错误吗?
Just Jake

它产生的文件看起来像25p,在适当的播放器中不如50i光滑。
BarsMonster 2011年

@slhck顺其自然
BarsMonster 2012年

任何具体的原因编码为MPEG-4视频,而不是再次使用H.264(如-vcodec libx264不是,它应该管那么多了在约20兆比特/秒,但仍?
slhck

@slhck好吧,这只是默认设置:-)
BarsMonster 2012年

Answers:



7

就像隔行扫描逐行内容将每个帧分为2个字段,从而使帧速率加倍一样,去隔行的常见方法是将每2个字段组合为1个帧,从而将速率降低2,从而将50变为25fps。您当然可以在每个最后一帧中加倍,但这并没有任何好处。

首先,我们可以读到不要使用-deinterlace和yadif(您已经做过):

 - deinterlace This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with -filter:v yadif. 

您可能会发现FFMPEG文档的yadif部分非常有趣:

Deinterlace the input video ("yadif" means "yet another deinterlacing filter"). 
It accepts the optional parameters: mode:parity:auto. 

MODE specifies the interlacing mode to adopt, accepts one of the following values: 
‘0’
output 1 frame for each frame
‘1’
output 1 frame for each field 
‘2’
like 0 but skips spatial interlacing check 
‘3’
like 1 but skips spatial interlacing check 
Default value is 0. 

PARITY default value is -1.
AUTO default value is 0. 

注意默认的MODE是如何为0的,它指示FFMPEG每2个字段输出1帧,从而使fps减半。我认为您正在寻找的是模式1:每场一帧。我不太确定如何使用这些可选参数,但也许像

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 

至少它可以提供50 fps的输出,但是不幸的是,生成的2个连续帧非常相似...当我逐帧步进原始50i视频时,我真的看到快速运动的步数增加了两倍,并且更加平滑。
BarsMonster '02

@BarsMonster首先,如果是由于某种形式的插值,我将尝试找出GOM播放器的功能。我很好奇-是否有太多包含高帧频信息的隔行扫描内容?(毕竟,将25p转换为50i进行广播不会创建任何新的运动信息-您需要从直线到隔行的内容)。接下来,如果您确实找到了GOM使用的去隔行技术(请参阅Wikipedia,有很多方法),则应尝试为其找到一个可以在AVISYNTH中使用的过滤器,而不是使用FFMPEG的-YADIF方法。
mtone 2012年

1

根据文档,该-r选项设置每秒的输出文件帧数。例如,这将输出设置为每秒50帧:

ffmpeg -i input.avi -r 50 output.avi

不幸的是,生成的文件与-r 25大致相同。而且不再混乱。看起来它只拍摄了25p视频,然后将其加倍了帧。
BarsMonster 2011年

您是否也尝试过指定输入帧率?
Just Jake

3
那真是太过分了。在对视频进行去隔行扫描时,您牺牲了平滑的运动以与逐行显示兼容。
杰森

@Jason Well,我的视频播放器(GOM Player)对50i视频进行去隔行处理,并在我的120Hz TFT监视器上流畅地显示(即以50Hz),这显然是渐进的。为什么视频编码器不能做同样的事情,并产生平滑的50Hz输出?我知道50i的细节较少,但是为什么不能期望获得50Hz的输出呢?
BarsMonster'2

这取决于所使用的去隔行滤波器。显然,GOM Player在此方面做得很好。不过,对FFmpeg如何处理隔行视频了解的不是很多。@BarsMonster
slhck

1

ffmpeg -i input.avi -deinterlace -filter:v yadif -s "1280x720" output.avi


1
不幸的是,它仍然只能以25 fps的速度输出...原始文件更加流畅....即使添加-r 50也无济于事。
BarsMonster 2012年

0

此命令对我有用:

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

来源是Sony便携式摄像机文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.