You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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的代码:

  1. 找到FFmpeg源码里的libavformat/mpegts.c文件
  2. 定位到处理流类型的代码块,一般是在mpegts_parse_stream函数里的switch (stream_type)部分
  3. 添加一个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;
  1. 重新编译FFmpeg,之后再用普通的提取命令(比如ffmpeg -i input.ts -map 0:2 private_stream.txt)就能正常提取了

需要注意的是,如果你的私有文本流有自定义的封装格式,光识别还不够,可能还需要写一个简单的比特流过滤器(BSF)来解析payload,但如果只是要原始数据的话,第一种命令方法足够用了。

备注:内容来源于stack exchange,提问作者Wayne Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 16:08:14