重新采样H264视频以降低帧速率,同时保持高图像质量



以下是感兴趣的视频的mplayer输出:

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12

我想使用ffmpeg、mencoder或其他命令行视频转码器将此视频重新采样到较低的帧速率,而不会损失图像的质量。也就是说,每一帧都应该尽可能保持清晰。

尝试

ffmpeg-i foo.mov-r 25-vcodec复制栏.mov
  • 实现了25fps的目标帧速率,但单个帧是"块状的">
mencoder-nosound-ovc复制foo.mov-of ps 25-o bar.mov
  • 视频实际上是不可见的

救命

这似乎是一个足够简单的用例。我很惊讶显而易见的事情没有奏效。我的做法有什么问题吗?

自2012年发布以来,情况发生了很大变化。我将为像我这样从搜索引擎中找到这个答案的人添加这个答案。我在以下方面运气不错:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

以下是关于每个参数的作用的简短解释:

  • -y:无需询问即可覆盖输出文件
  • -i source.mp4:输入文件名
  • -r 25:输出帧速率(以帧/秒为单位(
  • -s 160x90:输出帧大小(以像素为单位(-插入缩放视频滤波器
  • -c:v libx264:输出视频编码器
    • -c:v-codec:v-vcodec的缩写
  • -b:v 3M:传递给libx264编码器的视频比特率(以bit/s为单位(
  • -strict -2:管理标准合规性;-2允许实验功能-在2015-12-05版本之前的版本中启用本机FFmpeg AAC音频编码器所需的功能,请参阅此处,AAC现在是默认的音频编码器
  • -movflags faststart:将索引移动到输出文件的开头(mov和mp4格式特定参数(

有关更多详细信息,请参阅官方文档。

正如Andy T所指出的,您绝对必须对视频进行重新编码,但这并不意味着必须以任何明显的方式降低质量。

首先,确保您没有使用旧软件。视频编解码器是一个快速发展的领域,每隔几周就会有显著的进步。x264是目前最先进的视频编码器软件。这可能是mplayer使用的,但您可以从www.x264.nl 获得最新的真实版本

[编辑:HEVC和AV1现在是最先进的技术。正如我所说,这些都是快速发展的领域!]

首先,我会使用VirtualDub将其解压缩为无损视频类型,这将形成一个相当大的文件。VirtualDub还可以降低帧速率。请参见此处。

接下来,将其用作x264的输入。我建议您使用像Staxrip这样的辅助软件(将最新的32位8位每通道x264放在Staxrip\Applications\x264中。

如果你想要绝对最好的质量和最小的文件大小,而你不太可能注意到差异,请使用这样的命令行(带x264(:

x264 --preset placebo --tune film --crf 22 --level 4.1 --threads 1 --thread-input --sar 12:11 --output "<target>" "<source>"

Staxrip可以选择将预设切换为安慰剂,调整电影来源(当然假设这不是动画(,并将线程数减少到1。

您可以将"--crf 22"更改为21,以获得更大、质量更好的视频,但我发现CRF22几乎是我很难注意到差异的地方,即使是在逐帧比较时也是如此。其他设置中的任何更改都可能会在不提高质量的情况下降低质量或增加文件大小。增加线程数量将大大提高编码速度(显然在多核系统上(,但会略微降低质量(或者在这种情况下,因为我们使用的是基于质量的CRF,所以会稍微增加文件大小,比如4个线程的文件大小不到1%(。

大多数对视频进行编码或生产视频编码产品的公司真的不知道自己在做什么,即使他们知道了,他们也没有用这些设置进行编码所需的CPU能力,所以除了通过降低帧速率来适度减少文件大小外,使用设置最严格的智能编码器也会使文件大小急剧下降。

如果你想绝对确定生成的视频看起来尽可能接近VirtualDub的输出,使用CRF17没有人能分辨出区别,但文件会很大。您还可以压缩VirtualDub的输出(好吧,没那么糟糕!(。

在任何情况下,您都需要对视频进行转码。代码转换意味着您将解码流,更改帧速率(在简单情况下是丢弃帧(,然后再次对其进行编码。编码配置甚至编解码器都不取决于视频最初是如何编码的,所以您可以使用任何适合您需要的东西。如果您需要尽可能高的质量,只需在第一次尝试时高调编码即可。然后你可以试着用大量的h.264编码参数对其进行微调。

最新更新