使用可选的输出音频和字幕流时,如何在 FFmpeg 中指定 MPEG-DASH 适配集?

问题描述

我正在使用下面的脚本将视频转换为 MPEG-DASH 兼容的视频。我还希望能够处理没有音频和/或没有字幕的视频。因此,我在流说明符的末尾用 ? 标记了音频和字幕的流,例如-map a:0?

现在,当我想指定适配集时,我可以使用 id=0,streams=vid=1,streams=a 为视频和音频流设置它,但是我无法选择字幕流,就像我想要的那样id=2,streams=s,正如 docs 中所述(“要将所有视频(或音频)流映射到 AdaptationSet,“v”(或“a”)可以用作流标识符而不是 ID .”)。我唯一能做的就是指定一个 ID,如 id=2,streams=8,但要使其正常工作,音频和字幕流将是强制性的,否则没有 id 为 8 的流并且 FFmpeg 将失败。我想把-map s:0?放在第一个位置,然后我可以肯定,它总是id为0的流,但如果输入没有字幕流,那么就会有一个额外的适配集,与第一个版本的视频。我还考虑过使用 FFprobe 来获取有关可用流的信息,但并没有深入研究。

有谁知道我怎么能告诉 FFmpeg,当有一个带有字幕的流时,应该创建一个适配集,而不管是否有音频流?

非常感谢任何帮助。

#!/bin/bash

INPUT_PATH=$1
OUTPUT_PATH=$2

FPS=25
GOP_SIZE=100
PRESET_P=veryfast
V_SIZE_1=256x144
V_SIZE_2=426x240
V_SIZE_3=640x360
V_SIZE_4=854x480
V_SIZE_5=1280x720
V_SIZE_6=1920x1080

ffmpeg -i "$INPUT_PATH" \
    -preset $PRESET_P -keyint_min $GOP_SIZE -g $GOP_SIZE -sc_threshold 0 \
    -r $FPS -c:v libx264 -pix_fmt yuv420p -c:a aac -c:s copy \
    -map v:0 -s:0 $V_SIZE_1 -b:v:0 160k -maxrate:0 160k -bufsize:0 320k \
    -map v:0 -s:1 $V_SIZE_2 -b:v:1 450k -maxrate:1 450k -bufsize:1 900k \
    -map v:0 -s:2 $V_SIZE_3 -b:v:2 1M -maxrate:2 1M -bufsize:2 2M \
    -map v:0 -s:3 $V_SIZE_4 -b:v:3 2.5M -maxrate:3 2.5M -bufsize:3 5M \
    -map v:0 -s:4 $V_SIZE_5 -b:v:4 5M -maxrate:4 5M -bufsize:4 10M \
    -map v:0 -s:5 $V_SIZE_6 -b:v:5 8M -maxrate:5 8M -bufsize:5 16M \
    -map a:0? -b:a:0 128k -ac:a:0 1 \
    -map a:0? -b:a:1 384k -ac:a:1 2 \
    -map s:0? \
    -use_template 1 -use_timeline 1  \
    -seg_duration 4 -adaptation_sets "id=0,streams=v id=1,streams=a id=2,streams=s" \
    -f dash "$OUTPUT_PATH"

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)