zoukankan      html  css  js  c++  java
  • 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青犀视频云边端架构产品均为大家提供了试用版本,欢迎大家来进行测试。

  • 相关阅读:
    Android Overlay学习
    为WinForm combox控件增加自动完成功能
    职业理想
    How to become a hacerk.黑客
    .net程序员常用网站
    面向对象设计原则
    net开源cms系统
    如何:禁用 Windows 窗体 DataGridView 控件的按钮列中的按钮(摘录)
    计算机编码(百度百科)
    .net winform 从资源文件中引用图片资源
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/13924368.html
Copyright © 2011-2022 走看看