bash - ffmpeg/bash - 多个输出的映射代码

标签 bash video ffmpeg

我在 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 选项的输出将使用默认的 stream selection 行为,即每种流类型仅选择 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 Wiki: Map
  • 建议您将脚本粘贴到 shellcheck.net 以获得其他 Bash 建议。
  • 关于bash - ffmpeg/bash - 多个输出的映射代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69779903/

    相关文章:

    linux - bash脚本中的简单数学计算

    linux - 如果 [ "$state"== 1 ] ... 永远不等于 1

    ffmpeg - 使用 FFmpeg 呈现 2 个以上的视频

    bash - 在 bash 中从一个列表中删除另一个列表中的项目

    windows - 是否不能在 Emacs 中将 Windows Bash 用作 shell for ssh 等?

    javascript - WebRTC 重新协商对等连接以切换流

    python - ffmpeg 视频在 'Invalid buffer size, packet size < expected frame_size' 错误(vsync 屏幕撕裂故障)后垂直滑动?

    css - 嵌入式 Flash 视频隐藏了喜欢/发送按钮的飞出

    FFmpeg 许可证,无需分发即可转码

    ffmpeg - 在 ffmpeg 中进行后处理以在 MP4 文件中移动 'moov atom' (qt-faststart)