跳到主要内容

06 制作h264视频

阅读量

0

阅读人次

0

使用 FFMPEG 剪切视频

使用 选项-ss(在 -i 之前)指定开始位置的标记,选项-t 指定的结束位置标记来剪切指定的视频区间。 请注意,如果想在不重新编码的情况下剪切视频,请使用-c copy选项,对于如何正确设置-ss-t选项的时间点没有一般规则,因为这些取决于输入编码文件关键帧间隔。 作为参考,例如x264 编码器默认使用 250 的 GOP 大小,这意味着如果输入帧速率为 25 fps,则每 10 秒 1 个关键帧。

无需重新编码即可提取 20 秒

ffmpeg -ss 00:01:30.000 -i YOUR_VIDEO.mp4 -t 00:00:20.000 -c copy YOUR_EXTRACTED_VIDEO.mp4

让我们分解一下:

-ss 00:01:30.000:如果放在 -i 输入之前,则会在输入文件上移至指定时间处。 时间可以用小时、分钟、秒和毫秒来表示。 hh:mm:ss.ms 格式。

-i YOUR_VIDEO.mp4:这是一个示例输入视频

-t 00:00:20.000:所需部分的持续时间,可以以(hh:mm:ss.ms)格式 指定。 在本例中,持续时间为 20 秒。

-c copy:此选项将复制音频和视频流,无需重新编码

使用编码提取 20 秒

ffmpeg -ss 00:01:30.000 -i YOUR_VIDEO.mp4 -t 00:00:20.000 YOUR_EXTRACTED_VIDEO.mp4

在此示例中,FFMPEG 将重新编码输入,并将使用基本选项创建一个新的输出文件,基于输出文件中使用的扩展名。 使用此重新编码,将确保获得准确的部分,不会出现任何黑屏或音频丢失。如果您使用的是 h264 或 其他有损格式,那么使用此前命令中使用的-c copy选项可能会出现黑屏或音频丢失。

制作 h264/AVC 视频

2003 年,国际电信联盟 (ITU) 表示:“随着处理能力和内存成本的降低,对编码视频数据的网络支持多样化,以及视频编码技术的进步,需要一个行业标准 用于压缩视频表示,大大提高了编码效率并增强了对网络环境的鲁棒性。”

h264 编解码器,又名 AVC(Advanced Video Codec )高级视频编解码器,根据 BitMovin最近的一项调查显示,它仍然是目前最流行的在线编解码器,其为 Twitter 的 Periscope 和 BBC 等提供视频流。该编解码器已于 2003 年 5 月向公众公布。

Netflix 和亚马逊、思科、谷歌和英特尔等其他大玩家现在已经成立了“开放媒体联盟(Alliance for Open Media,AOM)”,以开发一种更先进(且免版税)的编解码器,它可能会很快取代 h264 标准。 但在那一天到来之前,最常见的视频格式仍然是 h264/AVC 编解码器。当用于视频流时,根据最近的调查,h264/AVC 仍然是首选。 为了更好地理解 h264 提供的压缩选项,FFMPEG 提供了一个H264 编码指南

不同的 h264 编码方法

使用 h264 时,如果目标是需要值定的输出文件大小且帧与帧之间的输出质量是否不太重要。可能需要首先确定固定码率系数,它可以保持最佳质量并且不太关心文件大小,还是使用两次编码(Two-Pass Encoding)。

使用固定码率系数

如 FFMPEG 文档所述,CRF 比例的范围是 0–51,其中 0 是无损的,23 是默认值,51 可能是最差质量。 较低的值通常会导致更高的质量,主观上合理的范围是 17-28。 考虑 17 或 18 在视觉上无损或几乎无损; 它应该看起来与输入相同或几乎相同,但它在技术上不是无损的。

预设(Preset)

预设是一组选项,可提供一定的编码速度与压缩比。

较慢的预设将提供更好的压缩(压缩是每个文件大小的质量评价)。 这意味着,例如,如果您以特定文件大小或恒定比特率为目标,您将使用较慢的预设获得更好的质量。 同样,对于恒定质量编码,您只需选择较慢的预设即可节省比特率。

使用能够根据实际情况接受的最慢预设。 按速度降序排列的可用预设是:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium(FFMPEG的默认预设)
  • slow
  • slower
  • verylow
  • placebo

不同的预设如何影响编码时间?

上面的表格。 从mediumslow,所需时间增加约 40%。 相反,减慢速度会导致需要多 100% 的时间(即需要两倍的时间)。 与medium相比,veryslow 需要 280% 的原始编码时间,而在质量方面仅比slower的改进很小。 使用 fast 节省大约 10% 的编码时间,faster 节省 25%。 超快将节省 55%,但质量会低得多。

调校(Tune)选项

FFMPEG 还提供了一个-tune选项,可以根据输入的具体情况更改设置。 选项有:

film:用于高质量的电影内容;

animation:适合卡通片;

grain:保留老式的胶片颗粒效果;

stillimage:适用于类似幻灯片的内容;

fastdecode :通过禁用某些滤镜来加快解码速度;

zerolatency:适用于快速编码和低延迟流式传输;

psnr: 仅用于编解码器开发;

ssim:仅用于编解码器开发;

示例:

ffmpeg -i your_video.mov -c:v h264 -crf 23 -tune film your_output.mp4

h264 中的属性配置

h264 已经为不同的目标设备构建了不同的属性配置,但 FFMPEG 只有 3 个可供直接使用的属性配置:

Baseline:某些设备(非常旧或过时)仅支持有限受约束的Baseline或Main属性配置。

Main:同上

High:大多数现代设备支持更高级别的高性能属性配置。

要在 FFMPEG 中指定特定配置文件,可以设置:

-profile:v baseline

或者

- profile:v main

或者

-profile:v high

话虽如此,除非您需要支持有限的设备,否则 FFMPEG 的建议是省略设置配置文件,这将允许 FFMPEG 的 x264 根据输入和命令选项自动选择适当的配置文件。

综上考虑,使用 CRF 方法将源文件转换为标准质量 h264 视频的基本命令如下:

ffmpeg -i [YOUR_SOURCE_VIDEO] -c:v h264 -preset medium -tune film -crf 23 -c:a copy output.mp4

二次(2-Pass)编码

如果您的目标是需要指定输出文件大小,并且每帧的输出质量不太重要,那么您可能需要使用二次编码方法。对于两次编码,您需要使用几乎相同的设置运行 FFMPEG 两次,除了在 第一次编码和第二次编码中,分别使用-pass 1-pass 2选项。

在第一次编码中,输出到空文件描述符,而不是实际文件。 这将生成 FFMPEG 第二次编码所需的日志文件。

在第一次编码中,需要指定与将在第二次编码中使用的输出格式相匹配的输出格式(使用-f指定)。在第一次编码中,您可以通过指定-an来保留音频。

使用 h264 进行二次编码的示例:

ffmpeg -y -i [YOUR_INPUT] -c:v h264 -b:v 2600k -pass 1 -an -f mp4 /dev/null && \ 
ffmpeg -i [YOUR_INPUT] -c:v h264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

无损 h264 编码

如前所述,-crf选项为您提供了使用“恒定速率因子”对视频进行编码的选项。 您可以使用-crf 0创建无损视频。 对于这种情况,ultrafastveryslow这两个预设参数是非常有用的,因为最快编码速度或最佳压缩通常是最重要的因素。 例子:

ffmpeg -i [YOUR_INPUT] -c:v h264 -preset ultrafast -crf 0 [YOUR_OUTPUT]

或者

ffmpeg -i [YOUR_INPUT] -c:v libx264 -preset veryslow -crf 0 [YOUR_OUTPUT]

请注意,无损输出文件的文件大小会很大,并且大多数基于非 FFmpeg 的播放器(例如 Quicktime)可能不会播放它们。

因此,如果需要考虑兼容性或文件大小的话,则不应使用无损。 FFMPEG 文档还提供了一个提示,该提示可用于在不使用-crf 0命令的情况下获得类似结果。

“如果您正在寻找大致“视觉无损”但在技术上不是无损的输出,请使用大约 17 或 18 的 -crf 值(您必须尝试查看哪个值适合您)。它将可能与源无法区分,并且不会像真正的无损模式那样产生巨大的、可能不兼容的文件。”

恒定比特率 (Constant Bit Rate,CBR)

根据 FFMPEG 文档,没有原生或真正的CBR模式,但可以通过调整一次性平均比特率编码的参数来“模拟”恒定比特率设置:

ffmpeg -i input.mp4 -c:v h264 -x264-params "nal-hrd=cbr" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M output.ts

在此公式中,-bufsize 是“速率控制缓冲区”,因此它将在每 2MBit 的视频中强制执行您请求的“平均值”(在本例中为 1 MBit/s)。 这里假设接收端/播放器将缓冲那么多数据,这意味着该范围内的波动是可以接受的。 上例中的 .ts 扩展名是一个“传输流”容器,通常用于流式传输的标准容器。

约束编码(Costrained Encoding)

如果你想限制使用的最大比特率,或者将流的比特率保持在一定的范围内,有一个方案可以实现这个结果。 这对于在线流媒体特别有用,其中客户端期望某个平均比特率,但您仍然希望编码器调整每帧的比特率。 您可以通过同时指定 -maxrate-bufsize来使用具有最大比特率的 -crf-b:v

ffmpeg -i input -c:v h264 -crf 23 -maxrate 1M -bufsize 2M output.mp4

在另一个示例中,不是使用恒定质量 (CRF) 作为目标,而是设置平均比特率。

这里首选二次编码。

第一遍:

ffmpeg -i input -c:v h264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f mp4 /dev/null

然后

ffmpeg -i input -c:v h264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 output.mp4

快速启动

如 FFMPEG 文档中所述,如果要在浏览器中查看视频,您可以添加-movflags +faststart作为输出选项。

这将在文件开头填充一些信息,并允许视频在完全下载之前开始播放。YouTube 也推荐使用改选项。

示例:

ffmpeg -i input -c:v h264 -crf 23 -maxrate 1M -bufsize 2M -movflags +faststart output.mp4