无需重新编码将两路视频转复用为并排画面
无转码合并两路同参数H264/H265视频为并排画面的实现方案
核心前提
必须确保两路视频所有编码参数完全一致,否则无转码合并根本无法实现:
- 单路分辨率相同(如W×H),目标合并后分辨率为2W×H
- 编码格式(H264/H265)、Profile/Level完全匹配
- 帧率、GOP长度、参考帧数量一致
- SPS/PPS(H264)或VPS/SPS/PPS(H265)的核心参数(色彩空间、熵编码模式、预测模式等)完全复用
可行实现步骤
你的思路方向正确,但需要针对压缩码流的特性调整细节:
1. 重构全局编码参数集
直接修改单路视频尺寸不可行,必须生成新的全局参数集:
- 针对H264:生成新的SPS/PPS,将分辨率设为合并后的2W×H,其余参数(如Profile、Level、色彩格式)完全照搬原视频的SPS/PPS
- 针对H265:生成新的VPS/SPS/PPS,同样仅修改分辨率为2W×H,其余参数复用原视频
- 新参数集必须放在合并后码流的最开头,替换原两路的参数集
2. 重组码流NAL单元(核心操作)
这一步不需要解码转码,仅修改压缩后的NAL单元头部信息:
H264方案:
将每对时间戳对齐的A、B帧NAL单元,改为同一帧的两个Slice:
- 调整每个Slice的
slice_address和slice_size字段,让解码器识别为大画面的左右两个部分(左Slice对应0到W-1列,右Slice对应W到2W-1列) - 保证两个Slice的PTS/DTS完全一致,且属于同一GOP结构
- 非关键帧(P/B帧)可直接复用,因为两路参考帧结构完全匹配
H265方案:
利用H265的**Tile(瓦片)**特性,将两路帧作为大画面的左右Tile:
- 修改原帧NAL单元的Tile配置,指定每个Tile在大画面中的位置
- 对齐时间戳,确保同一时间的两个Tile帧被解码器识别为同一帧的组成部分
3. 工具与代码参考
可以基于FFmpeg的libavcodec/libavformat库做二次开发:
- 用
av_parser_parse2解析两路视频的NAL单元 - 构造新的参数集(SPS/PPS/VPS)
- 调整NAL单元头部的Slice/Tile配置信息
- 将处理后的NAL单元写入新的容器(如MP4、TS)
- 注意:FFmpeg自带的
hstack滤镜是转码实现,不能用,必须自己实现底层NAL处理逻辑
关键注意事项
- 时间戳必须严格对齐:若两路视频PTS/DTS有偏差,需先做同步处理,否则画面会不同步
- 编码参数差一点都不行:哪怕Profile、色彩空间有微小差异,都会导致解码器无法正常解码合并后的码流
- 音频合并:若需合并音频,同样可无转码实现,只需将两路参数一致的音频码流按时间戳拼接即可
内容的提问来源于stack exchange,提问作者TAXfromDK
相关产品推荐
相关产品推荐

