如何使用 FFmpeg 将字幕列表硬编码到视频中?

如何使用 FFmpeg 将字幕列表硬编码到视频中?

我想弄清楚如何将字幕列表流式传输到 RTMP 服务器。

我的想法是,我有一个 MP3 文件列表和一个字幕列表。每个 mp3 都有自己的字幕。我试图做的是流式传输列表和视频背景(字幕硬编码到视频背景中)我尝试了很多选项

我设法将它们输出为带有软编码字幕的 MP4 视频,但我无法弄清楚如何使用硬编码字幕对它们进行流式传输,我的列表如下:

MP3


file 'path/to/audio1.mp3'
file 'path/to/audio2.mp3'
file 'path/to/audio3.mp3'
file 'path/to/audio4.mp3'
...

字幕

file 'path/to/audio1.srt'
file 'path/to/audio2.srt'
file 'path/to/audio3.srt'
file 'path/to/audio4.srt'
...

当然还有视频背景作为输入

我正在考虑使用 while 循环,但这将为每个 MP3 调用 ffmpeg,这对于实时流来说很不方便。

经过进一步挖掘,我得到了以下代码:

ffmpeg -f concat -safe 0 -i audioList.txt -f concat -safe 0 -i subtitleList.txt -i background/video.mp4 -filter_complex "[1:v][0:a]overlay[v1];[v1][2]subtitles[v2]" -map "[v2]" -c:a aac -b:a 128k -c:v h264 -b:v 3000k -f flv rtmp://stream/key

我不确定字幕是否会被硬编码,因为脚本根本不起作用,对我来说这似乎是正确的,但我收到了这个错误:

[Parsed_subtitles_1 @ 0xaaaacf52fb60]
No filename provided!
[AVFilterGraph @ 0xaaaacf5f6370] Error initializing filter 'subtitles'
Error initializing complex filters.
Invalid argument

我再检查了一下,subtitleList.txt似乎正确。

更新/编辑: 感谢@Hastur 建议使用命名管道以及所有发表评论的人。

正如我在评论中所说,还有另一种逻辑可以选择播放什么音频和字幕,这就是为什么使用命名管道对我来说是最好的选择。

我是第一次使用 ffmpeg 的命名管道,所以遇到了一些问题。我现在的情况如下:

创建管道后,我在 ffmpeg 中使用它们,如下所示:

ffmpeg -re -stream_loop -1 -i video.mp4 -i audio.pipe -vf "subtitles=srt.pipe:force_style='Name=Default,Fontname=Arial,Fontsize=14,PrimaryColour=&H00ffffff,Shadow=0,Alignment=2,MarginL=1,MarginR=1,MarginV=100'" -c:v libx264 -c:a copy -map 0:v -map 1:a -f flv rtmp://myRTMP

我通过运行来写入管道cat subtitle1.srt > srt.pipe & cat audio1.mp3 > audio.pipe

我现在遇到的问题是,通过执行将新数据发送到管道后cat subtitle2.srt > srt.pipe,如果cat audio2.mp3 > audio.pipeffmpeg 没有读取新数据,则 ffmpeg 有一个选项-reconnect_at_eof会在当前文件结束后尝试重新连接到该文件(在本例中为 fifo 管道)。

但我认为它只适用于一种输入,我用它audio.pipe并且它起作用了,但我不知道如何指定它srt.pipe

相关内容