zoukankan      html  css  js  c++  java
  • 记录音视频不同步的问题及解决过程

    背景

    在做国标级联,模块输入rtmp流,输出rtp+ps,视频H264, 音频转码aac →g711A.

    现象

    1、单视频流播放正常

    2、单音频服务器保存输出G711A文件播放正常

    3、音视频复合流播放音频拉慢了视频,大概1s视频播放了1.5-2s.同时音频也变慢了.

    4、ffprobe 发现音频的pts+ pkt_duration 大于下一个音频packet pts.

    尝试解决过程

    1、改变封装格式,

    rtp+ ps header + ps system header + ps map + pesv + rtp + ps header + pesa

    -------------→

    rtp + ps header + ps system header + ps map + pesv + pesa.

    封装格式符合gb28181文档标准,但是对音视频同步没有效果.

    2、aac转g711过程中,发现一个rtmp的aac音频msg,经过ffmpeg转码输出3-5个g711a音频packet, 再把这三个音频packet分别封装成pes, 三个pes使用同一个pts.pts是透传的rtmp msg的timestamp.格式为:

    rtp + ps header + ps system header + ps map + pesv(with PTS V) + pesa1(with PTS A) + pesa2(with PTS A)  + pesa3(with PTS A) 

    做了改动把三个相同pts的音频pes合并为同一个pes, 最后的格式为:

    rtp + ps header + ps system header + ps map + pesv(with PTS V) + pesa(with PTS A) 

    竟然音视频不同步的问题解决了!!!

    分析

    g711是固定的采样率、通道数和采样位数, 在封装rtp/ps的时候并没有对这些参数进行传递,仅仅对pts进行了设置.而pts又是透传rtmp的时间戳(ts * 90), 所以这个时间不会出错.所以想到了合并音频pes的问题.

  • 相关阅读:
    Vue.js 2.0更新之增加Virtual DOM讲解
    Json串的单引号和双引号引发的问题解析
    理解javascript中的Function.prototype.bind的方法
    微信小程序开源项目库汇总
    PYTHON.redis_day02
    PYTHON.redis_day01
    PYTHON3.AJAX_day02
    PYTHON3.day01_Ajax
    PYTHON3.django_day08(见pdf)
    PYTHON3.django_day07(见pdf)
  • 原文地址:https://www.cnblogs.com/micoblog/p/15425560.html
Copyright © 2011-2022 走看看