FFmpeg转码后AAC extradata及extradata_size未通过UDP传输问题
解决FFmpeg UDP传输TS流时接收端extradata_size为0的问题
我来帮你排查这个extradata丢失的问题,结合你给出的发送和接收命令,主要有几个可能的原因和对应的解决思路:
一、确保发送端正确生成并传递extradata
你的发送端命令中对音频转码为AAC,但可能没有强制FFmpeg将包含extradata的全局头写入输出流,导致TS流里没有携带关键的音频配置信息:
- 添加
-flags +global_header参数,强制FFmpeg把包含extradata的全局头写入流的起始位置,修改后的发送命令:./ffmpeg -re -y -loglevel verbose -err_detect careful -f mpegts -i <ts_file_path> -c:v copy -c:a aac -flags +global_header -f mpegts "udp://127.0.0.1:2567" - 可以额外添加
-mpegts_flags +resend_headers参数,让FFmpeg定期重发流的头部信息,避免接收端因丢包错过初始的extradata:./ffmpeg -re -y -loglevel verbose -err_detect careful -f mpegts -i <ts_file_path> -c:v copy -c:a aac -flags +global_header -mpegts_flags +resend_headers -f mpegts "udp://127.0.0.1:2567" - 先验证输入TS文件本身是否有音频extradata,用
ffprobe <ts_file_path>查看输出,确认音频流的extradata_size不为0——如果输入本身就没有,发送端也无法生成有效extradata。
二、调整接收端的流探测配置
接收端的探测参数可能不足以捕获到extradata:
- 增大
analyzeduration和probesize的值,给FFmpeg更多时间和数据量解析流头部:./ffmpeg -re -y -loglevel error -err_detect careful -analyzeduration 16000000 -probesize 8000000 -rtbufsize 300000 -flush_packets 0 -fflags +genpts -max_delay 20000... - 暂时去掉
-fflags +discardcorrupt参数,确认是不是这个参数丢弃了包含extradata的初始损坏(或格式特殊)的包,排查后再决定是否加回。
三、排查FFmpeg版本兼容性
不同版本的FFmpeg对TS流中extradata的封装/解析逻辑可能存在差异,尝试升级到最新稳定版的FFmpeg,看看是否解决了这个兼容性问题。
内容的提问来源于stack exchange,提问作者diS
相关产品推荐
相关产品推荐

