如何让FFmpeg在单循环静音视频中自动插入mp3音轨?
How to make FFmpeg automatically inject mp3 audio tracks in the single cycled muted video?
大家好!所以基本上这就是我想要实现的目标:
我有一个大约 3 分钟长的静音视频。
我有一个 mp3 格式的音轨列表(文件夹中有 40 首歌曲,每首持续时间为 2 到 6 分钟)
我希望此视频自动循环播放,从播放列表中提取歌曲并将它们一首一首地插入到视频中。每次一首歌曲结束时,列表中的下一首歌曲应该立即开始播放。视频继续播放并且不关心曲目的持续时间。
我认为这是在 24/7 模式下在 youtube 上播放带有视频背景的广播的第一步,无需停止翻译即可将其他曲目添加到播放列表。
我的问题是我是 FFmpeg 的新手,如果有任何关于开始调查哪个 FFMpeg 主题以实现我的目标的建议,我将不胜感激
使用连接分离器
您可以对 concat demuxer 的播放列表进行实时更新,但是每个音频文件必须具有相同的属性、相同的流数并且格式相同。
创建 input.txt
包含:
ffconcat version 1.0
file 'audio1.mp3'
file 'audio2.mp3'
file 'audio3.mp3'
file 'audio40.mp3'
所有文件名都必须是“安全的”,否则将失败 Unsafe file name
。文件名基本上没有特殊字符,只使用绝对路径。有关详细信息,请参阅 concat demuxer。
运行 ffmpeg
流式传输到 YouTube:
ffmpeg -re -framerate 10 -loop 1 -i image.jpg -re -f concat -i input.txt -map 0:v -map 1:a -c:v libx264 -tune stillimage -vf format=yuv420p -c:a aac -g 20 -b:v 2000k -maxrate 2000k -bufsize 8000k -f flv rtmp://youtube
当您准备好添加新歌曲时,制作 temp.txt
包含:
ffconcat version 1.0
file 'audio41.mp3'
file 'audio42.mp3'
file 'audio43.mp3'
原子地替换input.txt
:
mv temp.txt input.txt
有关更多信息,请参阅 FFmpeg Wiki: Concatenate。
如果您的音频文件不一样
input.txt
中列出的文件必须全部相同:
- 格式(AAC、MP3 等,但不能混合)
- 采样率(48000、44100 等)
- 声道数(单声道、立体声等)。
如果它们不同,那么您必须在将它们添加到播放列表之前对其进行预处理。 Bash 以 44100 采样率 (-ar 44100
) 使每个音频符合立体声 (-ac 2
) 并在 M4A 容器中保存为 AAC 格式的示例:
mkdir conformed
for f in *.mp3; do ffmpeg -i "$f" -map 0:a -ac 2 -ar 44100 -c:a aac "conformed/${f%.*}.m4a"; done
建议输出为 AAC 以流式传输到 YouTube。
如果您这样做,则可以避免将 ffmpeg
命令中的音频重新编码到 YouTube。只需在步骤 #2 中将 -c:a aac
更改为 -c:a copy
:运行 ffmpeg
以流式传输到 YouTube.
大家好!所以基本上这就是我想要实现的目标:
我有一个大约 3 分钟长的静音视频。 我有一个 mp3 格式的音轨列表(文件夹中有 40 首歌曲,每首持续时间为 2 到 6 分钟)
我希望此视频自动循环播放,从播放列表中提取歌曲并将它们一首一首地插入到视频中。每次一首歌曲结束时,列表中的下一首歌曲应该立即开始播放。视频继续播放并且不关心曲目的持续时间。
我认为这是在 24/7 模式下在 youtube 上播放带有视频背景的广播的第一步,无需停止翻译即可将其他曲目添加到播放列表。
我的问题是我是 FFmpeg 的新手,如果有任何关于开始调查哪个 FFMpeg 主题以实现我的目标的建议,我将不胜感激
使用连接分离器
您可以对 concat demuxer 的播放列表进行实时更新,但是每个音频文件必须具有相同的属性、相同的流数并且格式相同。
创建
input.txt
包含:ffconcat version 1.0 file 'audio1.mp3' file 'audio2.mp3' file 'audio3.mp3' file 'audio40.mp3'
所有文件名都必须是“安全的”,否则将失败
Unsafe file name
。文件名基本上没有特殊字符,只使用绝对路径。有关详细信息,请参阅 concat demuxer。运行
ffmpeg
流式传输到 YouTube:ffmpeg -re -framerate 10 -loop 1 -i image.jpg -re -f concat -i input.txt -map 0:v -map 1:a -c:v libx264 -tune stillimage -vf format=yuv420p -c:a aac -g 20 -b:v 2000k -maxrate 2000k -bufsize 8000k -f flv rtmp://youtube
当您准备好添加新歌曲时,制作
temp.txt
包含:ffconcat version 1.0 file 'audio41.mp3' file 'audio42.mp3' file 'audio43.mp3'
原子地替换
input.txt
:mv temp.txt input.txt
有关更多信息,请参阅 FFmpeg Wiki: Concatenate。
如果您的音频文件不一样
input.txt
中列出的文件必须全部相同:
- 格式(AAC、MP3 等,但不能混合)
- 采样率(48000、44100 等)
- 声道数(单声道、立体声等)。
如果它们不同,那么您必须在将它们添加到播放列表之前对其进行预处理。 Bash 以 44100 采样率 (-ar 44100
) 使每个音频符合立体声 (-ac 2
) 并在 M4A 容器中保存为 AAC 格式的示例:
mkdir conformed
for f in *.mp3; do ffmpeg -i "$f" -map 0:a -ac 2 -ar 44100 -c:a aac "conformed/${f%.*}.m4a"; done
建议输出为 AAC 以流式传输到 YouTube。
如果您这样做,则可以避免将
ffmpeg
命令中的音频重新编码到 YouTube。只需在步骤 #2 中将-c:a aac
更改为-c:a copy
:运行ffmpeg
以流式传输到 YouTube.