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

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

我有一些 H.265 编码文件,这些文件占用大量资源,无法正常播放,而我的转换软件 (mencoder) 目前不支持 H.265 格式。我可以在命令行批处理文件中将它们转换为 H.264,以便快速转换文件以便使用 Devede/OGMrip 重新压缩吗?在搜索此网站后,我没有找到相关讨论,因此我将发布我认为有用的问题和答案。

答案1

是的,使用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

    这将设置目录中的所有 .mkv 文件以包含在批处理中。这可以更改以适应您要处理的文件的容器扩展名。

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

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

    • h264_mp4toannexb- 是激活的比特流过滤器。

      将 H.264 比特流从长度前缀模式转换为起始代码前缀模式(如 ITU-T H.264 规范附件 B 中所定义)。

      这是某些流媒体格式所必需的,通常 MPEG-2 传输流格式(mpegts)处理 MKV h.264(当前)需要此功能,如果不包含,您将在终端窗口中收到错误,指示您使用它。

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

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

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

    • "$i.ts" 将输出保存为 .ts 格式,这很有用,因为不会覆盖源文件。

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

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

答案2

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

这些例子是为最近的人写的ffmpeg。省点麻烦,下载最新版本。然后输入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 维基:H.264了解有关这些选项的更多信息。

MP4 输出

这个稍微复杂一点。这将根据输入音频是否为 AAC 执行条件编码。如果输入音频是 AAC,则音频将按原样进行流复制(重新混合),从而避免不必要的重新编码。如果输入音频是不是AAC 然后它将被重新编码为 AAC。

这是一个简单的脚本,演示了如何使用ffprobe和执行此操作ffmpeg。将其复制并保存到包含要转换的视频的目录中,使用 授予其执行权限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

答案3

考虑到之前的答案,我得出了以下结论:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

假设文件的名称始终以 结尾265.mkv。此结尾将被替换为264.mkv

如果您的文件命名不同,则需要相应地调整命令。

相关内容