Android端RTP传输MPEG2-TS封装H.264流的实现方案咨询
Android端MPEG2-TS流生成方案(适配Miracast推流场景)
你不需要从零实现完整的MPEG2-TS协议规范,有两类成熟方案可选:
可直接复用的现成库
- 老牌Android流媒体库libstreaming:内置独立的MPEG2-TS封装模块,直接接收
MediaCodec输出的H.264裸码流即可输出标准TS包,自带RTP打包逻辑,完全匹配Miracast单视频流推流的需求,你可以单独抽取TS封装模块使用,不需要依赖库内的采集、编码相关代码,优先选社区维护的AndroidX兼容分支即可。 - 轻量纯Java库minits:无额外依赖,核心逻辑仅针对实时TS流生成场景设计,代码体量极小,支持直接输入H.264 NAL单元输出符合标准的TS分片,不需要提前做预封装,适合不想引入大型依赖的场景。
- 裁剪版FFmpeg native依赖:如果可以接受引入小型so库,可以编译仅开启MPEG2-TS复用、H.264流解析功能的裁剪版FFmpeg,最终so体积可以控制在1MB以内,调用libavformat的复用接口喂入编码帧即可输出TS流,兼容性是所有方案里最高的。
轻量自实现方案(适配Miracast场景,复杂度极低)
Miracast接收端对TS流的兼容性极强,仅需要支持单路H.264视频流即可,完全不需要实现多节目、加扰、数据广播等扩展特性,你之前用ByteBuffer手动构造RTP头的经验完全可以复用,只需要实现三个核心逻辑,总代码量在300行Java左右:
不需要啃完整的MPEG2-TS官方规范,仅实现最小必要子集即可正常工作
- 预生成固定的PAT、PMT表TS包:因为是单路固定视频流,PAT、PMT的结构完全固定,可以提前写死对应的字节内容,推流过程中每隔100ms在流中插入一次这两个包即可,不需要动态计算表内容。
- H.264帧的PES封装:将编码输出的I帧、P帧分别封装为PES包,PES头内填入对应帧的PTS/DTS时间戳即可,视频流的PES包长度可以直接设为
0表示无长度限制,省去分片长度计算逻辑。 - TS固定长度分片:将PES数据切分为固定
188字节长度的TS包,每个包开头填入4字节TS头,设置正确的PID、连续性计数器值,每个PES的第一个TS包需要置位payload unit start indicator标记,不需要用到自适应字段时直接设置适配区控制位为仅含payload,后续直接跟PES数据即可。
*注意:自实现时只需要保证时间戳连续、连续性计数器按包递增、PAT/PMT表定期发送,绝大多数Miracast设备都可以正常解码显示,不需要处理TS规范里的各种边缘场景。
内容的提问来源于stack exchange,提问作者Aaronjamt
相关产品推荐
相关产品推荐

