Audio 如何使用FFmpeg从.mp3文件中获取元数据并将其作为文本放到视频中?
在我之前打开的主题中: 我从@llogan那里得到了关于如何在youtube上播放循环短静音视频的详细解释,该视频自动在其中注入音频曲目,而不会中断翻译 我计划增强流量,下一个问题是如何在广播中动态添加额外的文本 先决条件: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.
我的问题是如何正确获取元数据并使用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