向已运行GStreamer流水线添加10秒wav文件播放的问题咨询
动态添加WAV支路的问题解决
只播放后半段的核心原因
wavparse解析WAV文件输出的音频帧默认时间戳从0开始,而已经运行的主流水线时钟已经走到了对应时间点,audiomixer会直接丢弃时间戳早于当前时钟的音频帧,因此第6秒添加支路时前6秒的WAV内容都会被丢弃,仅能听到最后4秒。
设置ts-offset后音频损坏的原因
你把clocksync节点放在了wavparse前面,这是错误的:
filesrc输出的是未解析的二进制WAV数据流,本身没有标准化的音频帧时间戳- 此时给二进制数据块加时间戳偏移,会打乱
wavparse识别帧边界、生成正确音频时间戳的逻辑,甚至导致采样率、声道数解析错误,输出自然全是杂音和咔哒声。
正确操作方案
- 调整新增支路的链路顺序,将
clocksync放在wavparse之后,保证偏移是加在已经解析好的带正确原始时间戳的音频帧上:filesrc -> wavparse -> clocksync -> audiomixer - 保留你现有的偏移设置代码即可:
nanosecs = pipeline.query_position(Gst.Format.TIME)[1] clocksync.set_property("ts-offset", nanosecs) - 把新增支路所有元素状态设为
Gst.State.PLAYING即可,不需要修改主流水线状态,不会产生爆音。
可选简化方案
不需要额外加clocksync节点也能实现相同效果:给audiomixer对应新支路的sink pad设置offset属性,值为当前流水线的运行时间(纳秒)即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者tamworth10
相关产品推荐
相关产品推荐

