使用Java API io.humble如何在视频任意时间点编码插入音频?
关于Humble Video任意时间点插入音频的解决方案
问题根因
手动设置时间戳无效的核心原因有三点:
- 参考示例默认采用连续采样逻辑,所有采样的时间偏移均从0开始累加,无空白时间预留逻辑
- Humble的
Encoder默认开启FLAG_CALCULATE_PTS参数,会自动计算每个包的PTS/DTS,手动设置的值会被直接覆盖 - 音频时间戳需要严格匹配音频流的时间基,和采样率、单采样帧的采样数强绑定,直接赋值不符合规范的时间戳会被编码器丢弃
具体实现步骤
1. 关闭编码器自动计算时间戳的开关
创建编码器时添加如下配置,禁用自动时间戳计算:
encoder.setFlag(Encoder.Flag.FLAG_CALCULATE_PTS, false);
2. 统一时间基计算规则
音频流的时间基建议设置为1/采样率,比如44100采样率的音频对应时间基配置为:
Rational audioTimebase = Rational.make(1, 44100);
目标插入时间(单位:秒)对应的起始PTS计算公式为:起始PTS = 插入时间秒数 * 采样率
例如要在第5秒插入音频,44100采样率下的起始PTS就是5 * 44100 = 220500
3. 为采样数据设置正确的时间戳
每次生成/读取音频采样后,给MediaAudio对象配置时间属性:
// currentPts为当前采样块的起始PTS mediaAudio.setTimeBase(audioTimebase); mediaAudio.setPts(currentPts); // 采样块处理完成后累加PTS,下一块的PTS为当前PTS+当前采样块的采样数 currentPts += mediaAudio.getNumSamples();
4. 空白时间处理规则
如果插入位置和上一段音频之间有空白段,不需要额外生成静音采样,直接把下一段音频的起始PTS设置为目标时间对应的PTS即可,播放器会自动处理空白段的静音。
5. MP3片段插入适配逻辑
加载MP3文件时先解码得到所有MP3采样,把解码得到的所有MediaAudio的PTS统一加上目标插入时间对应的PTS偏移量,再送入编码器即可。
注意事项
- 所有音频采样的时间基必须和音频流的时间基完全一致,否则会出现时间偏移错误
- 编码后的数据包不需要再手动设置时间戳,编码器会直接沿用
MediaAudio的PTS - 多段音频插入时,注意累计PTS不要出现回退,否则编码器会直接报错
内容的提问来源于stack exchange,提问作者HappyEngineer
相关产品推荐
相关产品推荐

