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

时间:2012-06-12 20:14:48

标签: video ffmpeg transcoding mplayer mencoder

这是感兴趣的视频的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 copy bar.mov
  • 目标帧速率--25fps - 已实现,但各个帧“块状”。
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • 视频实际上无法观看。

帮助!

这似乎是一个简单的用例。我很惊讶明显的事情不起作用。我的做法有问题吗?

3 个答案:

答案 0 :(得分:90)

自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:输出帧大小(以像素为单位) - 插入scale video filter
  • -c:v libx264:输出视频编码器
    • -c:v-codec:v-vcodec
    • 的缩写
  • -b:v 3M:视频比特率(以bit / s为单位)传递给libx264 encoder
  • -strict -2:管理标准合规性; -2允许使用实验性功能 - 在版本低于2015-12-05的版本中启用原生FFmpeg AAC音频编码器,请参阅hereAAC is now the default audio encoder
  • -movflags faststart:将索引移动到输出文件的开头(mov and mp4 format特定参数)

有关详细信息,请参阅official documentation

答案 1 :(得分:6)

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

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

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

首先,我会使用VirtualDub解压缩为无损视频类型,这将产生一个非常大的文件。 VirtualDub还可以降低帧速率。请参阅here

接下来,使用它作为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的输出(好吧,不是那么糟糕!)。

答案 2 :(得分:0)

您无论如何都需要对视频进行转码。转码意味着您将对流进行解码,更改帧速率(在简单情况下丢帧),然后再对其进行编码。编码配置甚至编解码器不依赖于您的视频最初编码方式,因此您可以使用任何适合您需求的内容。如果您需要尽可能高的质量,只需首先进行高调编码即可。然后你可以尝试使用大量h.264编码参数进行微调。