排查方案

最近更新时间:2017-12-21 21:18:41

排查方案

音画不同步

  • 问题描述

音画不同步,主要表现在推流后用户听到的声音和看到的画面不同步,发生这种问题的原因可能有很多种,比如服务端或者源站异常,SDK采集、编码、推流异常等。

虽然发生这种问题的可能性很小,但是目前并不能完全避免这种情况的发生,因此在发生这种问题的时候,及时采取必要的措施,阻止拉流端持续拿到错误的数据

  • 解决方法

针对SDK侧造成的音画不同步,如果在采集的时候音频的pts数据和视频的pts数据差距很大,比如差距超过5s,则停止推流,并上报错误信息给服务端,同时通过回调通知App

  • 方案详细说明

Android推流软编,方案实装版本3.3.2.0及以上;硬编,方案实装版本3.3.3.0及以上

在音频和视频采集时,如果两者的pts的绝对差值超过了5s,则发送KSYVIDEO_AV_SYNC_ERROR(-2004)的错误码给上层的App,同时会发送实际的音视频pts绝对差值(单位为s)。SDK内部会主动停止推流。App可以通过现有的错误回调StreamStatusEventHandler.OnStatusErrorListener来接收改错误信息。App在收到这个错误回调时,可以提示用户,重新开启推流。示例代码如下:

public StreamStatusEventHandler.OnStatusErrorListener mOnStatusErrorListener = new StreamStatusEventHandler.OnStatusErrorListener() {
        @Override
        public void onError(int what, int arg1, int arg2, String msg) {
        ......
           boolean needRetry = true;
           switch (what) {
                case RecorderConstants.KSYVIDEO_AV_SYNC_ERROR:
                    Log.e(TAG, "the streaming stopped because KSYVIDEO_AV_SYNC_ERROR, pts diff:" +
                                String.valueOf(arg1)+ “s”);
                    if (mHandler != null) {
                        //TODO这个message中可以返回App线程提示或重新开始推流
                        mHandler.obtainMessage(what, msg).sendToTarget();
                    }
                    needRetry = false;
                    break;           
           }
        ......
    }
}

锁屏Crash

  • 问题描述

正确集成金山SDK到自己的项目中,能成功实现预览和推流功能,在切换到后台(点击home、锁屏等),再切回来的时候,会偶现crash。

  • 改善方法

以iOS推流kit类为例

  • 手动注册通知:
    NSNotificationCenter *notiftication = [NSNotificationCenter defaultCenter];
  • 添加对APP将要暂停运行事件的响应:

     [notiftication addObserver:self
                      selector:@selector(enterBack:)
                          name:UIApplicationDidEnterBackgroundNotification
                        object:nil];
  • 添加对APP重新开始运行事件的响应:
    [notiftication addObserver:self
                      selector:@selector(becameActive:)
                          name:UIApplicationDidBecomeActiveNotification
                        object:nil];
  • APP将要暂停运行: ``
    • (void) enterBack:(NSNotification *)not{ [_kit appEnterBackground:NO]; }
  • APP重新开始运行
    - (void) becameActive:(NSNotification *)not{
        [_kit appBecomeActive];
    }
  • 移除通知
    - (void)viewDidDisappear:(BOOL)animated{
       [[NSNotificationCenter defaultCenter] removeObserver:self];
    }

预览画面变大

  • 问题描述

在iOS推流的实际项目中发现,预览和推流画面,会比系统相机显示的放大不少。 如下图所示,左侧为系统相机效果,右侧为多数用户使用效果。

排查方案

  • 修复方法

该效果涉及预览、推流三个参数的配合。 一般出现放大问题时,是因为用户配置_kit.capPreset采用了以下两个值:

AVCaptureSessionPreset640x480

AVCaptureSessionPreset960x540

推荐配置:

_kit.capPreset = AVCaptureSessionPreset1280x720; 
_kit.previewDimension = CGSizeMake(720,1280); 
_kit.streamDimension = CGSizeMake(360,640); 

以上代码,表示使用AVCaptureSessionPreset1280x720采集,并使用720p预览。但是编码和推流使用360p。

  • capPreset设置的是系统相机的采集输出分辨率;
  • previewDimension设置的是预览分辨率;
  • streamDimension设置的是编码、推流分辨率;

一般推荐相机采集和预览分辨率较高,以获得较好的预览体验。

效果如下: 排查方案

以上美颜由金山美颜提供,欢迎使用!

预览卡顿

  • 问题描述

预览时,画面帧率很低,不够流畅。

出现在v1.9.2(含)以前

  • 原因

kit.videoFPS 未做初始化;

修复方法

在开始预览前,主动调用videoFPS设置预览和推流帧率

kit.videoFPS = 15;
  • 说明

v1.9.3(含)以后,videoFPS默认值为15,即使不再设置也不会引入额外的预览卡顿。

金山云,开启您的云计算之旅

免费注册