bash - ffmpeg/bash - 多个输出的映射代码
问题描述
我在 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 开始)。请参阅FFmpeg 维基:地图。 - 建议您将脚本粘贴到shellcheck.net以获得其他 Bash 建议。
推荐阅读
- c++ - Boost Interprocess:托管共享内存错误
- maven - lein jar 包含 project.clj 和 pom.xml
- c# - 从父 .xaml 文件中引用 resourceDictionary
- java - 如何防止 do while 循环重置?
- python - 打包 xlwings 错误导入 UDF
- javascript - Webpack 中的动态导入:可以在子文件夹之间分配块吗?
- python - Python蛮力密码猜测器
- java - Spring CriteriaBuilder 按名称搜索枚举
- python - 从python中的列表中删除重复项
- view - 使用 CouchDB 中的视图按过滤器搜索