FFmpeg分段录制MP3流时文件大小无法实时更新的问题求助
我来帮你解决这个FFmpeg录制MP3流时文件无法实时增长的问题!
你遇到的这个现象,本质是FFmpeg的MP3复用器(muxer)默认会使用一个256KB的输出缓存——只有当缓存被填满时,才会把数据一次性写入磁盘,所以你看到文件以固定数据包大小增长。虽然你已经加了-flush_packets 1,但这个参数主要控制数据包的刷新逻辑,对于MP3这种有特定帧结构的格式,还需要额外调整复用器的缓存设置。
针对你使用的Ubuntu 18.04和FFmpeg 3.4.6版本(这个版本虽不算新,但所需参数已支持),给你几个可行的解决方案:
方案1:直接添加-flush_size 0参数
这个参数会强制FFmpeg每处理完一帧音频就立刻写入磁盘,彻底绕过缓存等待。修改后的命令如下:
ffmpeg -i http://radiocentova.conectastm.com:8363/stream -y -acodec libmp3lame -b:a 16k -ac 1 -ar 11025 -vn -strftime 1 -f segment -segment_time 3600 -flush_packets 1 -flush_size 0 test_%Y%m%d%H%M%S+00.mp3
PS:我把文件名前的@去掉了——这个符号可能会让FFmpeg解析文件名出错,如果你是特意加的可以忽略这个修改哈。
方案2:通过segment格式选项指定flush参数
如果你想更明确地针对segment输出格式设置,可以用-segment_format_options传递flush参数:
ffmpeg -i http://radiocentova.conectastm.com:8363/stream -y -acodec libmp3lame -b:a 16k -ac 1 -ar 11025 -vn -strftime 1 -f segment -segment_time 3600 -flush_packets 1 -segment_format_options flush_size=0 test_%Y%m%d%H%M%S+00.mp3
额外优化(若上述方案仍有延迟)
如果调整后还是有启动延迟或者写入不及时,可以尝试减少FFmpeg对输入流的探测缓存,让它更快进入处理状态:
ffmpeg -probesize 32 -analyzeduration 0 -i http://radiocentova.conectastm.com:8363/stream -y -acodec libmp3lame -b:a 16k -ac 1 -ar 11025 -vn -strftime 1 -f segment -segment_time 3600 -flush_packets 1 -flush_size 0 test_%Y%m%d%H%M%S+00.mp3
另外,如果你之前的分段功能未生效,还可以尝试添加-segment_atclocktime 1参数,让FFmpeg严格按照系统时钟的整点生成新文件(比如每到00分00秒就切换分段),分段逻辑会更准确。
内容的提问来源于stack exchange,提问作者Lucas Cardoso
相关产品推荐
相关产品推荐

