FFmpeg循环推流时如何获取当前播放音频文件数据以显示曲目信息
单条FFmpeg命令跑concat推流的模式没法直接稳定拿到当前播放的音轨元数据,不用折腾FFmpeg内部日志或者复杂的自定义滤镜,用轻量外层脚本做调度是7*24小时直播场景下最稳定、实现成本最低的方案,具体实现逻辑如下:
实现方案
核心逻辑调整
放弃原来单条命令加载整个音频播放列表的写法,把音轨切换、元数据更新的逻辑放到外层脚本(用bash/python写都可以,几十行代码就能搞定)控制:
- 启动推流前先遍历整个播放列表,用ffprobe提前提取每首MP3的标题、艺术家、专辑信息,导出内嵌的专辑封面存为临时文件,同时记录每首音频的精确时长,整理成有序的播放队列
- 视频流保持原有的循环播放逻辑全程不中断,脚本按队列顺序逐首喂给FFmpeg音频流,每触发切歌动作时,同步更新两个外部文件:一个是存当前播放曲目标题的文本文件,一个是存当前专辑封面的图片文件
- FFmpeg端配置滤镜自动读取这两个外部文件的最新内容渲染到画面上,全程不用重启推流进程,不会出现断流、画面卡顿的问题
调整后的推流命令
ffmpeg -loglevel error -re -stream_loop -1 -i video.mp4 \ -re -i current_audio.mp3 \ -loop 1 -f image2 -i current_cover.jpg \ -filter_complex " [0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,format=yuv420p[bg]; [2:v]scale=220:220[cover]; [bg][cover]overlay=W-w-40:40[cover_layer]; [cover_layer]drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:textfile=current_track.txt:fontsize=34:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=2:x=40:y=50:reload=1[outv] " \ -map "[outv]" -map 1:a \ -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \ -r 25 -g 50 \ -c:a aac -b:a 128k -ar 44100 \ -f flv rtmp://localhost/live/my-stream
关键参数说明:
- drawtext滤镜加
reload=1参数,会自动检测绑定的文本文件变更,切歌时直接覆盖current_track.txt的内容,画面上的曲目标题会实时刷新,不需要重启进程 - 专辑封面通过overlay滤镜叠在画面右上角,每首歌加载前提前把对应封面覆盖为
current_cover.jpg即可,-loop 1参数会让图片输入持续渲染,不会出现封面消失的问题 - 移除原命令里的
-shortest参数,音频切换由外层脚本根据提前拿到的音轨时长计时触发,保证音视频全程对齐
元数据提取方法
直接用ffprobe读取MP3的内置标签即可,不需要额外第三方工具:
# 提取音轨标题 ffprobe -v error -select_streams a:0 -show_entries format_tags=title -of default=noprint_wrappers=1:nokey=1 target.mp3 # 提取艺术家名称 ffprobe -v error -select_streams a:0 -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 target.mp3 # 导出MP3内嵌的专辑封面 ffmpeg -v error -i target.mp3 -map 0:v -frames:v 1 current_cover.jpg -y
不推荐抓取FFmpeg日志获取播放信息的原因
如果硬要保留原单条命令加载整个concat列表的写法,只能把日志级别开到debug,过滤分离器输出的文件打开日志来识别当前播放的音轨,这个方案有三个硬伤,完全不适合7*24小时不间断直播:
- 日志输出存在固有延迟,经常出现音轨已经播放3-5秒,画面文字还没更新的不同步问题
- 不同版本FFmpeg的debug日志格式不统一,后续升级FFmpeg版本后日志过滤规则很容易失效
- debug模式日志输出量极大,长时间运行很容易写满服务器磁盘,故障排查难度高
相比之下外层脚本调度的方案所有逻辑都可控,切歌精度可以到毫秒级,出问题也能快速定位,稳定性高很多。
内容的提问来源于stack exchange,提问作者Viktor Kushnir
相关产品推荐
相关产品推荐

