如何让FFmpeg在单循环静音视频中自动注入mp3音轨?

Grr*_*zly 1 audio video ffmpeg broadcast stream

大家都在这儿!所以基本上这就是我想要实现的目标:

我有一个大约 3 分钟长的静音视频。我有一个 mp3 格式的音轨列表(一个文件夹中有 40 首歌曲,每首歌曲持续时间 2 到 6 分钟)

我希望这个视频自动循环播放,从播放列表中提取歌曲并将它们一首一首地注入到视频中。每次一首歌曲结束时,列表中的下一首歌曲就会立即开始播放。视频继续播放,不关心曲目的持续时间。

我认为这是在 YouTube 上以 24/7 模式播放带有视频背景的广播的第一步,并且能够将其他曲目添加到播放列表中,而无需停止翻译。

我的问题是,我是 FFmpeg 的新手,如果有任何关于开始研究哪个 FFMpeg 主题以实现我的目标的建议,我将不胜感激

llo*_*gan 7

使用 concat 解复用器

您可以对concat demuxer的播放列表进行实时更新,但每个音频文件必须具有相同的属性、相同的流数量,并且全部采用相同的格式。

  1. 创建input.txt包含:

    ffconcat version 1.0
    file 'audio1.mp3'
    file 'audio2.mp3'
    file 'audio3.mp3'
    file 'audio40.mp3'
    
    Run Code Online (Sandbox Code Playgroud)

    所有文件名必须是“安全的”,否则将会失败并带有Unsafe file name. 文件名中基本上没有特殊字符,仅使用绝对路径。有关详细信息,请参阅concat 分离器。

  2. 运行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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 当您准备好添加新歌曲时,请temp.txt包含:

    ffconcat version 1.0
    file 'audio41.mp3'
    file 'audio42.mp3'
    file 'audio43.mp3'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 原子替换input.txt

    mv temp.txt input.txt
    
    Run Code Online (Sandbox Code Playgroud)

请参阅FFmpeg Wiki:连接以获取更多信息。

如果您的音频文件不相同

列出的文件input.txt必须全部具有相同的内容:

  • 格式(AAC、MP3 等,但不能混合)
  • 采样率(48000、44100 等)
  • 通道数(单声道、立体声等)。

如果它们有所不同,那么您必须在将它们添加到播放列表之前对其进行预处理。Bash 示例使每个音频符合立体声 ( -ac 2) 和 44100 采样率 ( -ar 44100) 并在 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
Run Code Online (Sandbox Code Playgroud)
  • 建议输出为 AAC 以流式传输到 YouTube。

  • 如果您这样做,则可以避免将ffmpeg命令中的音频重新编码到 YouTube。只需在步骤 #2 中更改-c:a aac为:运行以流式传输到 YouTube-c:a copyffmpeg