我在RaspberryPi3上使用ffmpeg(99%肯定它是我从https://johnvansickle.com/ffmpeg/获得的预编译版本,因为其他方法对我来说安装失败)
起点:
几个多媒体文件,每个文件有一个视频轨道,一个或多个音频轨道,有时还有大量字幕。
我的目标:
一个bash脚本接受3个输入:分别为视频的轨道号(主要是0),音频的轨道号(主要是1,但可以是2或..)和字幕的轨道号(主要是2,但也可以是3或7或..)。
作为输出,我想:
a)一个新的视频文件与选定的轨道(视频,单一音频,这是重新编码,单一字幕)B)一个新的单独的SRT文件,只有选定的字幕。
我的代码已经为a)工作,但似乎不能让它为b)工作
见下文。它确实生成我想要的视频与正确的轨道选择。
但它无法写入正确的srt文件:似乎总是默认为第一个字幕轨道?
是我的映射不正确,还是这是bash编码问题?
该文件名为Remux.sh,并带参数调用,例如:./Remux.sh 0 1 5
#!/bin/bash
PATH="/mnt/USB1/Series/_Remux/"
for fullfile in "$PATH"*.mkv
do
newname="${fullfile%}_converted.mkv"
srtname="${fullfile%}_converted.srt"
/usr/local/bin/ffmpeg -i "${fullfile}" -map 0:$1 -map 0:$2 -map 0:$3
-c:v copy -c:s copy -c:a ac3 -b:a 640k "${newname}"
-c:s copy "$srtname"
done
编辑:非常感谢@llogan的指示!它现在使用映射添加:)
每个输出必须有自己的-map
选项。否则,没有-map
选项的输出将使用默认的流选择行为,每个流类型只选择1个流。
#!/bin/bash
PATH="/mnt/USB1/Series/_Remux/"
for fullfile in "$PATH"*.mkv
do
newname="${fullfile%}_converted.mkv"
srtname="${fullfile%}_converted.srt"
/usr/local/bin/ffmpeg -i "${fullfile}" -map 0:$1 -map 0:$2 -map 0:$3
-c:v copy -c:s copy -c:a ac3 -b:a 640k "${newname}"
-map 0:$3 -c:s copy "$srtname"
done
- 您可能会发现在
-map
选项中使用流说明符很有帮助,例如-map 0:s:1
用于字幕流#2(索引从0开始)。 - 建议您将脚本粘贴到shellcheck.net中以获得额外的Bash建议。