我想弄清楚如何将字幕列表流式传输到 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.pipe
ffmpeg 没有读取新数据,则 ffmpeg 有一个选项-reconnect_at_eof
会在当前文件结束后尝试重新连接到该文件(在本例中为 fifo 管道)。
但我认为它只适用于一种输入,我用它audio.pipe
并且它起作用了,但我不知道如何指定它srt.pipe
。