我猜这可以通过某种方式完成,因为我见过一些程序,它们是 FFMPEG 的 GUI 前端,基本上可以做到这一点,但我正试图从 Ubuntu 中的命令行弄清楚。我想将 ATSC 录音中的 MPEG2 视频流转码为 h264,但保留所有音频通道。我还想将隐藏式字幕转换为最终 MKV 包装器中的字幕轨道。此外,是否可以至少将主音轨和字幕轨道标记为“恩glish”?为了使它更加出色,将其制作成一个 BASH 脚本,我可以在其中命名输入文件并将其保存为相同的名称,但将其更改为 .mkv 会使其变得完美。我不了解如何从头开始编写脚本,也不知道 FFMPEG 命令的正确变量。
答案1
这有点棘手,但这是一个可行的方法:
INFILE=input.ts
OUTFILE=output.mkv
ffmpeg \
-i "${INFILE}" \
-f lavfi -i movie="${INFILE}[out+subcc]" \
-map 0 -map 1:s \
-codec:v libx264 \
-codec:a copy \
-codec:s srt \
-metadata:s:s:0 language=eng \
"${OUTFILE}"
这里,input.ts
和output.mkv
分别是您想要的输入 MPEG-TS 和输出 Matroska 文件。将其推广到脚本留给读者作为练习。
逐行解释参数:
-i ...
是输入文件。
-f lavfi -i ...
允许我们提取嵌入的字幕流。
-map 0 -map 1:s
选择要输出的流。
-codec:v libx264
告诉 ffmpeg 将视频转换为 H.264。
-codec:a copy
将所有音频流不加改变地复制到输出。
-codec:s srt
告诉 ffmpeg 将嵌入的字幕转换为 SRT。
-metadata:s:s:0 language=eng
将字幕流语言设置为英语。
笔记:
- 我只将它用于无线 ATSC 流,包括我假设的 EIA-608 字幕。我不知道它是否适用于 QAM(有线)录音,尽管我预计它可以。
- 即使您将文件名放在引号中,输入包含某些字符的文件名也可能会遇到问题。
- 这将复制所有音频流。如果您只想要第一个,则需要从输入 0 明确映射各个流。
- 音频流可能已经设置了语言。如果没有,请添加另一个 -metadata 选项来设置音频流语言。
- 您可能希望使用 -crf 选项试验视频编码质量。如果您的输入视频是隔行扫描,您可能还希望通过添加行
-filter:v bwdif=0,scale=1280:720
后的-map
内容来反隔行扫描并缩放到 720p。