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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:10