当前位置: 首页>>技术教程>>正文


使用 ffmpeg 将 H.265 mkv 批量转换为 H.264 以使文件与 re-encoding 兼容

, , ,

问题描述

我的 H.265 编码文件占用大量资源,播放效果不佳,而且我的转换软件(mencoder)(当前)不支持 H.265 格式。我可以在命令行批处理文件中将它们转换为 H.264 以使用 Devede/OGMrip 快速转换 re-compression 的文件吗?在搜索这个网站时,我没有发现它被讨论过,所以我会发布我认为有用的问题并回答这个问题。

最佳答案

是的,使用 ffmpeg

打开终端并将其定向到包含 H.265 编码文件的目录,假设您已安装 ffmpeg 和相应的库,并假设它们为 MKV 格式,请将以下内容复制并粘贴到终端窗口中。

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

你有它。这将在同一目录中的 MPG 容器中转换为 h.264。

命令开关说明:

  • for i in *.mkv ; do ... done \n这会将目录中的所有 .mkv 文件设置为包含在批处理中。这可以更改以适应您希望处理的文件的容器扩展名。

  • ffmpeg -i "$i" \n执行程序 ffm​​peg 并调用要处理的文件。\n

    • -bsf:v 激活要使用的视频比特流过滤器。

    • h264_mp4toannexb – 是被激活的比特流过滤器。\\n将 H.264 比特流从长度前缀模式转换为开始代码前缀模式(如 ITU-T H.264 规范的附件 B 中所定义)。\\n这是由一些流格式,通常是处理 MKV h.264(当前)的 MPEG-2 传输流格式 ( mpegts ) 需要这个,如果不包括在内,您将在终端窗口中收到指示您使用它的错误。

    • -sn 停止字幕流的流式传输(对于那些不想在视频中包含字幕的人)这是可选的,可以删除。

    • -map 0:0 -map 0:1 告诉 ffmpeg 只处理文件的前两个流(0:0 是视频流,0:1 是文件的第一个音频流)。这做了两件事,去除多余的音频流,通常第一个音频流是英语但并非总是如此。删除了其他流(例如嵌入的字幕)以减小文件大小。这也是一个可选字符串。您可以使用 ffprobe 查看文件中可用的流。 -map 是可选的,可以从命令中丢弃。

    • -vcodec libx264 \\n这告诉 ffmpeg 将输出编码为 H.264

    • "$i.ts" \\n将输出保存为 .ts 格式,这很有用,以免覆盖您的源文件。

  • mv "$i.ts" "$i.mpg" 将文件扩展名转换为同一目录中的 MPG。这可以设置为将其发送到您喜欢的任何目录。

  • sleep 3 – 允许进程休息,让 ffmpeg 有时间排队下一个文件

次佳答案

H.265 到 H.264 的批量转换

这些示例是为最近的 ffmpeg 编写的。为自己省点麻烦,download 是最新版本。然后将 ffmpeg 二进制文件放入 ~/bin/usr/local/bin 中(您可能必须先注销然后登录才能注意到它)。

Matroska 输出

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • 此示例将输出到名为 h264vids 的目录。

  • 此示例假设您的输入是 .mp4 。如果没有,请将示例中的 .mp4 实例更改为您的输入文件类型,或者仅使用贪婪的 * 本身。

  • 为质量调整 -crf,为编码速度/效率调整 -preset。或者只是删除这些选项并使用相当好的默认值并且应该足以满足大多数情况(示例是使用这些选项的默认值)。有关这些选项的更多信息,请参阅 FFmpeg Wiki: H.264

MP4 输出

这个有点复杂。这将根据输入音频是否为 AAC 执行条件编码。如果输入音频是 AAC,则音频将按原样流式复制 (re-muxed),避免不必要的 re-encoding。如果输入音频不是 AAC,那么它将是 re-encoded 到 AAC。

这是一个简单的脚本,演示如何使用 ffprobeffmpeg 执行此操作。将其复制并保存到包含要转换的视频的目录中,使用 chmod +x yourscriptname 授予它执行权限,然后使用 ./yourscriptname 运行它。

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • 此示例将输出到名为 h264vids 的目录。

  • 此示例假设您的输入是 .mkv 。如果没有,请将示例中的 .mkv 实例更改为您的输入文件类型,或者仅使用贪婪的 * 本身。

  • 请参阅上面关于 -crf-preset 的注释。

  • 您可以使用 ctrl + z 暂停编码并使用 fg 恢复。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12913.html,未经允许,请勿转载。