我有一些 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
。
如果您的文件命名不同,则需要相应地调整命令。