Audio 如何使用FFmpeg从.mp3文件中获取元数据并将其作为文本放到视频中?

Audio 如何使用FFmpeg从.mp3文件中获取元数据并将其作为文本放到视频中?,audio,video,ffmpeg,stream,broadcast,Audio,Video,Ffmpeg,Stream,Broadcast,在我之前打开的主题中: 我从@llogan那里得到了关于如何在youtube上播放循环短静音视频的详细解释,该视频自动在其中注入音频曲目,而不会中断翻译 我计划增强流量,下一个问题是如何在广播中动态添加额外的文本 先决条件: youtube广播由ffmpeg启动并运行 短3分钟的视频在无限循环中付费 播放列表中的音频曲目由“ffmpeg concat”自动获取,并逐个注入视频 这是开始翻译的基本命令: ffmpeg-re-fflags+genpts-stream_loop-1-i video.

在我之前打开的主题中:

我从@llogan那里得到了关于如何在youtube上播放循环短静音视频的详细解释,该视频自动在其中注入音频曲目,而不会中断翻译

我计划增强流量,下一个问题是如何在广播中动态添加额外的文本

先决条件:

  • youtube广播由ffmpeg启动并运行
  • 短3分钟的视频在无限循环中付费
  • 播放列表中的音频曲目由“ffmpeg concat”自动获取,并逐个注入视频
  • 这是开始翻译的基本命令:

    ffmpeg-re-fflags+genpts-stream_loop-1-i video.mp4-re-f concat -i input.txt-map 0:v-map 1:a-c:v libx264-tune stillimage-vf format=yuv420p-c:a copy-g 20-b:v 2000k-maxrate 2000k-bufsize 8000k-f飞行高度rtmp://a.rtmp.youtube.com/live2/my-key

    我想带来的改进

  • 我计划在音频文件中存储一些元数据(基本上是艺术家名和歌曲名)
  • 当一首特定歌曲开始播放时,艺术家/歌曲名称应取自元数据,并在整首歌曲播放期间以文本形式显示在视频中
  • 当当前歌曲结束,新歌曲开始播放时,应将以前的艺术家/歌曲文本替换为新歌曲等

  • 我的问题是如何正确获取元数据并使用ffmpeg将其添加到现有的广播配置中?

    这是一个相当广泛的问题,我没有完整的解决方案。但我可以提供一个包含几个命令的部分答案,您可以使用这些命令来帮助实现解决方案

    按需更新视频文本 看

    获取标题和艺术家元数据 使用
    ffprobe

    ffprobe -v error -show_entries format_tags=title -of default=nw=1:nk=1 input.mp3
    ffprobe -v error -show_entries format_tags=artist -of default=nw=1:nk=1 input.mp3
    
    或组合:
    format\u tags=title,artist
    (请注意,
    title
    将首先显示,然后显示
    artist
    ,而不管命令的顺序如何)

    获取歌曲的持续时间 看

    你需要弄清楚什么 困难的部分是知道何时更新drawtext筛选器中的
    textfile
    中引用的文件,如上面的update text on video on demand所示

    惰性解决方案 为每首歌曲预先制作一段视频,包括标题和艺术家信息。简单的Bash示例:

    audio=input.mp3; ffmpeg -stream_loop -1 -i video.mp4 -i "$audio" -filter_complex "[0:v]scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720,setsar=1,fps=25,drawtext=text='$(ffprobe -v error -show_entries format_tags=title,artist -of default=nw=1:nk=1 $audio)':fontsize=18:fontcolor=white:x=10:y=h-th-10,format=yuv420p[v]" -map "[v]" -map 1:a -c:v libx264 -c:a aac -ac 2 -ar 44100 -g 50 -b:v 2000k -maxrate 2000k -bufsize 6000k -shortest "${audio%.*}.mp4"
    
    现在您已经进行了编码,并且所有内容都符合相同的属性,以便进行适当的连接,您可能只需要将播放列表发送到YouTube(但我没有测试):

    请参考您之前关于如何操作的问题

    参考资料:


    可以使用带有
    重新加载
    文本文件
    选项的过滤器(请参阅)。问题是
    input.txt
    中列出的音频文件基本上被视为一个单一的输入,失去了它们的“个性”。因此,问题就变成了时间问题:你如何知道何时更新标题?因此,如果没有办法使用音频文件的元数据作为文本输入,这将成为一项非常复杂的任务。我可以假设的是,如果我们在
    input.txt
    中有类似file1.m4a、file2.m4a的文件,那么我们需要有单独的文本文件,对应于包含文本的file1.txt、file2.txt等文件名,并从中提取文本。然后,可能每次新歌开始时,我们都应该确定它的文件名持续时间,或者保留一个单独的文件(-s),其中包含有关所有曲目持续时间的信息。但这似乎不是一个简单的解决方案基本上这个youtube频道就是我想要实现的,我意识到他们可以使用完全不同的方法,比如使用OBS的流,Streamlabs覆盖,一些音频播放器作为音频输入。但我认为ffmpeg是一种更轻量级、硬件消耗更少的解决方案
    ffmpeg -re -f concat -i input.txt -c copy -f flv rtmp://a.rtmp.youtube.com/live2/my-key