RTMP推流组件EasyRTMPAndroid同时推音频流和视频流时为什么会出现画面不动的情况?

EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等方面。

有的用户咨询我们EasyRTMP-Android推流能不能自由支配音频,为什么同时推音频流和视频流时,视频画面很容易出现卡死的状态?本文我们来分享一下EasyRTMP-Android 在推流音视频过程中,这种情况出现的原因。

在EasyRTMP-Android推流组件初始化推流时,使用了mEasyPusher.initPush(url, context, callback); 即同时推流音视频,此时底层推流库的时间戳会同步到音频的时间戳,那么当推流过程中停止推流音频时,因为没有音频时间戳了,时间戳的处理就出错了,播放器解析不了视频帧数据了,画面就卡住不动了。

因为底层库需要同步音频时间戳,所以停止采集音频时,还需要继续推流音频,那么可以继续推流默认的无声的音频,开启/关闭默认音频推流的线程如下:

public void start() {
    enableAudio = true;
    openDefaultAudio = false;

    stopAacThread();
    startRecord();
}

public void stopAudio() {
    enableAudio = false;
    openDefaultAudio = true;

    stop();
}

单独推流默认音频的线程代码如下:

aacThread = new Thread(new Runnable() {
    @Override
    public void run() {

        while (true) {
            if (enableAudio) {
                break;
            }

            Collection<Pusher> p;
                synchronized (AudioStream.this) {
                    p = sets;
                }

                Iterator<Pusher> it = p.iterator();

                // 推流
                while (it.hasNext()) {
                    Pusher ps = it.next();

                    char[] aacData;
                    if (is8K) {
                        aacData = gAACMuteData;
                    } else {
                        // SRS服务器接收不了8k音频
                        aacData = gAACMuteData1;
                    }

                    try {
                        ps.push(new String(aacData).getBytes("UTF-8"),
                               0,
                               aacData.length,
                               mBufferInfo.presentationTimeUs / 1000,
                               0);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                    Log.v(TAG, "push audio");
                }

                try {
                    Thread.sleep(128);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    });

因此我们增加以上两段代码,既可把音频流和视频流的解码数据分开,达到停止采集音频,视频也可以正常播放的目的。

那么本文EasyRTMP推流组件的介绍就到这里了,如果大家还有兴趣或者有需求,欢迎联系我们,TSINGSEE青犀视频云边端架构产品均为大家提供了试用版本,欢迎大家来进行测试。

原文地址:https://www.cnblogs.com/TSINGSEE/p/13924368.html