如何通过FFmpeg提取MPEG-TS中第三路私有文本流的payload
如何通过FFmpeg提取MPEG-TS中第三路私有文本流的payload
嘿,我来帮你搞定这个提取私有文本流payload的问题!先给你两种可行的方案,优先试试简单的命令方法,要是不行再考虑修改代码~
一、直接用FFmpeg命令提取(优先尝试)
其实不用急着改代码,FFmpeg本身就支持直接提取未识别的私有流数据,关键是要精准指定目标流并直接复制原始数据。你可以试试这条命令:
ffmpeg -i input.ts -map 0:2 -c copy -f data private_stream_payload.bin
我来拆解一下每个参数的作用:
-map 0:2:明确指定要处理输入文件(索引0)的第三路流(索引2,因为FFmpeg里流是从0开始计数的)-c copy:告诉FFmpeg直接复制流的原始数据,不对它做任何编码或解码操作,这样能完整保留payload-f data:强制输出为原始数据格式,避免FFmpeg因为识别不了流类型而报错
执行完这条命令后,private_stream_payload.bin里就是你要的私有流payload了。要是这条命令还是报错,可能是你的FFmpeg版本比较旧,可以先升级到最新稳定版再试试。
二、修改mpegts.c让FFmpeg识别该私有流
如果上面的命令不好使,那可能是FFmpeg的MPEG-TS解复用器(demuxer)没有把这个私有流类型(0x0080)映射到合适的编码ID,导致无法正确处理。这时候就需要修改mpegts.c的代码:
- 找到FFmpeg源码里的
libavformat/mpegts.c文件 - 定位到处理流类型的代码块,一般是在
mpegts_parse_stream函数里的switch (stream_type)部分 - 添加一个case来匹配你的私有流类型(0x80,也就是十六进制的0x0080),把它映射到合适的编码ID,比如如果是文本流可以用
AV_CODEC_ID_TEXT,或者用AV_CODEC_ID_PRIVATE_DATA来标记为私有数据:
case 0x80: codecpar->codec_id = AV_CODEC_ID_TEXT; // 或者AV_CODEC_ID_PRIVATE_DATA codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE; // 或者AVMEDIA_TYPE_DATA break;
- 重新编译FFmpeg,之后再用普通的提取命令(比如
ffmpeg -i input.ts -map 0:2 private_stream.txt)就能正常提取了
需要注意的是,如果你的私有文本流有自定义的封装格式,光识别还不够,可能还需要写一个简单的比特流过滤器(BSF)来解析payload,但如果只是要原始数据的话,第一种命令方法足够用了。
备注:内容来源于stack exchange,提问作者Wayne Chen
相关产品推荐
相关产品推荐

