我正在使用下面的脚本将视频转换为符合 MPEG-DASH 的视频。我还希望能够处理没有音频和/或没有字幕的视频。?
因此,我在流说明符 fe 的末尾用 a 标记了音频和字幕的流-map a:0?
。
现在,当我想指定适配集时,我可以使用id=0,streams=v
和为视频和音频流设置它id=1,streams=a
,但我不能像我想要的那样选择字幕流,正如文档id=2,streams=s
中所述(“映射所有视频(或音频)流到 AdaptationSet,“v”(或“a”)可以用作流标识符而不是 ID。”)。我唯一能做的就是指定一个 ID,例如,但要使其正常工作,音频和字幕流将是强制性的,因为否则没有 ID 为 8 的流并且 FFmpeg 会失败。我想把id=2,streams=8
-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"