开发个好的RTMP播放器到底难在哪里?RTMP播放器对标和考察指标

好多开发者提到,RTMP播放器,不知道有哪些对标和考察指标,以下大概聊聊我们的一点经验,感兴趣的,可以关注 github:

1. 低延迟:大多数RTMP的播放都面向直播场景,如果延迟过大,严重影响体验,所以,低延迟是衡量一个好的RTMP播放器非常重要的指标,目前大牛直播SDK的RTMP直播播放延迟比开源播放器更优异(大牛直播SDK延迟在1秒左右,开源播放器如VLC,延迟在5-7秒),而且长时间运行下,大牛直播SDK播放端不会造成延迟累积,开源或第三方播放器,长时间运行,容易产生延迟累积;

部分服务器会缓存GOP,确保快速实现首屏播放,又不影响延迟,对此,我们设计了快速启动接口,快速render第一帧的同时,追到最新的播放数据:

		/** 设置秒开, 1为秒开, 0为不秒开*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetFastStartup(IntPtr handle, Int32 isFastStartup);

2. 音视频同步处理大多播放器为了追求低延迟,甚至不做音视频同步,拿到audio video直接播放,导致a/v不同步,还有就是时间戳乱跳等各种问题,大牛直播SDK提供的播放器,具备好的时间戳同步和异常时间戳矫正机制;

备注:如果是超低延迟模式下,可以0 buffer,不做音视频同步:

        /** 设置低延时播放模式,默认是正常播放模式* mode: 1为低延时模式, 0为正常模式,其他只无效* 接口调用成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetLowLatencyMode(IntPtr handle, Int32 mode);

3. 支持多实例:大牛直播SDK提供的RTMP直播播放SDK支持在设备性能允许的情况下,支持多实例播放RTMP流数据,大多开源播放器对多实例支持不太友好;

除了常规的多实例外,比如大屏监控场景下,尽管我们CPU占用已经是行业内非常低的了,但是好多厂家下,不是每路都需要全帧播放,针对此种情况,我们做了实时只播放关键帧和全帧播放的接口设计,比如8个实例,其中不太重要的几路数据,可以设置只播放关键帧,需要重点关注时,点击全帧率播放即可,这样既节省了系统开销,又实现了多路播放的目的:

        /** 设置只解码视频关键帧* is_only_dec_key_frame: 1:表示只解码关键帧, 0:表示都解码, 默认是0* 成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetOnlyDecodeVideoKeyFrame(IntPtr handle, Int32 is_only_dec_key_frame);

4. 支持buffer time设置:在一些有网络抖动的场景,播放器需要支持buffer time设置,一般来说,以毫秒计,开源播放器对此支持不够友好;

5. 实时静音:比如,多窗口播放RTMP流,如果每个audio都播放出来,体验非常不好,所以实时静音功能非常必要,开源播放器不具备实时静音功能;

6. 视频view旋转:好多摄像头由于安装限制,导致图像倒置,所以一个好的RTMP播放器应该支持如视频view实时旋转(0° 90° 180° 270°)、水平反转、垂直反转,开源或第三方播放器不具备此功能;

        /**上下反转(垂直反转)*is_flip: 1:表示反转, 0:表示不反转*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetFlipVertical(IntPtr handle, Int32 is_flip);/**水平反转*is_flip: 1:表示反转, 0:表示不反转*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetFlipHorizontal(IntPtr handle, Int32 is_flip);/** 设置旋转,顺时针旋转* degress: 设置0, 90, 180, 270度有效,其他值无效* 注意:除了0度,其他角度播放会耗费更多CPU* 接口调用成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRotation(IntPtr handle, Int32 degress);

7. 支持解码后audio/video数据输出:大牛直播SDK接触到好多开发者,希望能在播放的同时,获取到YUV或RGB数据,进行人脸匹配等算法分析,开源播放器不具备此功能;

        public void SDKVideoFrameCallBack(UInt32 status, NT_SP_VideoFrame frame){if (cur_video_frame_.plane0_ != IntPtr.Zero){Marshal.FreeHGlobal(cur_video_frame_.plane0_);cur_video_frame_.plane0_ = IntPtr.Zero;}cur_video_frame_ = frame;this.Invalidate();}public void SDKAudioPCMFrameCallBack(UInt32 status, IntPtr data, UInt32 size,Int32 sample_rate, Int32 channel, Int32 per_channel_sample_number){//这里拿到回调的PCM frame,进行相关操作(如自己播放)//label_debug.Text = per_channel_sample_number.ToString();//releaseMarshal.FreeHGlobal(data);}public void SetVideoFrameCallBack(IntPtr handle, IntPtr userData, UInt32 status, IntPtr frame){if (frame == IntPtr.Zero){return;}//如需直接处理RGB数据,请参考以下流程NT_SP_VideoFrame video_frame = (NT_SP_VideoFrame)Marshal.PtrToStructure(frame, typeof(NT_SP_VideoFrame));NT_SP_VideoFrame pVideoFrame = new NT_SP_VideoFrame();pVideoFrame.format_ = video_frame.format_;pVideoFrame.width_ = video_frame.width_;pVideoFrame.height_ = video_frame.height_;pVideoFrame.timestamp_ = video_frame.timestamp_;pVideoFrame.stride0_ = video_frame.stride0_;pVideoFrame.stride1_ = video_frame.stride1_;pVideoFrame.stride2_ = video_frame.stride2_;pVideoFrame.stride3_ = video_frame.stride3_;Int32 argb_size = video_frame.stride0_ * video_frame.height_;pVideoFrame.plane0_ = Marshal.AllocHGlobal(argb_size);CopyMemory(pVideoFrame.plane0_, video_frame.plane0_, (UInt32)argb_size);if (playWnd.InvokeRequired){BeginInvoke(set_video_frame_call_back_, status, pVideoFrame);}else{set_video_frame_call_back_(status, pVideoFrame);}}public void SetAudioPCMFrameCallBack(IntPtr handle, IntPtr user_data,UInt32 status, IntPtr data, UInt32 size,Int32 sample_rate, Int32 channel, Int32 per_channel_sample_number){if (data == IntPtr.Zero || size == 0){return;}IntPtr pcmData = Marshal.AllocHGlobal((Int32)size);CopyMemory(pcmData, data, (UInt32)size);if (playWnd.InvokeRequired){BeginInvoke(set_audio_pcm_frame_call_back_, status, pcmData, size, sample_rate, channel, per_channel_sample_number);}else{set_audio_pcm_frame_call_back_(status, pcmData, size, sample_rate, channel, per_channel_sample_number);}}

8. 实时快照:感兴趣或重要的画面,实时截取下来非常必要,一般播放器不具备快照能力,开源播放器不具备此功能;

        /** 捕获图片* file_name_utf8: 文件名称,utf8编码* call_back_data: 回调时用户自定义数据* call_back: 回调函数,用来通知用户截图已经完成或者失败* 成功返回 NT_ERC_OK* 只有在播放时调用才可能成功,其他情况下调用,返回错误.* 因为生成PNG文件比较耗时,一般需要几百毫秒,为防止CPU过高,SDK会限制截图请求数量,当超过一定数量时,* 调用这个接口会返回NT_ERC_SP_TOO_MANY_CAPTURE_IMAGE_REQUESTS. 这种情况下, 请延时一段时间,等SDK处理掉一些请求后,再尝试.*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_CaptureImage(IntPtr handle, IntPtr file_name_utf8,IntPtr call_back_data, SP_SDKCaptureImageCallBack call_back);public void SDKCaptureImageCallBack(IntPtr handle, IntPtr userData, UInt32 result, IntPtr file_name){if (file_name == IntPtr.Zero)return;int index = 0;while (true){if (0 == Marshal.ReadByte(file_name, index))break;index++;}byte[] file_name_buffer = new byte[index];Marshal.Copy(file_name, file_name_buffer, 0, index);byte[] dst_buffer = Encoding.Convert(Encoding.UTF8, Encoding.Default, file_name_buffer, 0, file_name_buffer.Length);String image_name = Encoding.Default.GetString(dst_buffer, 0, dst_buffer.Length);if (playWnd.InvokeRequired){BeginInvoke(set_capture_image_call_back_, result, image_name);}else{set_capture_image_call_back_(result, image_name);}}

9. 网络抖动处理(如断网重连):稳定的网络处理机制、支持如断网重连等,开源播放器对网络异常处理支持较差;

        /*事件ID*/public enum NT_SP_E_EVENT_ID : uint{NT_SP_E_EVENT_ID_BASE = NTBaseCodeDefine.NT_EVENT_ID_SMART_PLAYER_SDK,NT_SP_E_EVENT_ID_CONNECTING			= NT_SP_E_EVENT_ID_BASE | 0x2,	/*连接中*/NT_SP_E_EVENT_ID_CONNECTION_FAILED	= NT_SP_E_EVENT_ID_BASE | 0x3,	/*连接失败*/NT_SP_E_EVENT_ID_CONNECTED			= NT_SP_E_EVENT_ID_BASE | 0x4,	/*已连接*/NT_SP_E_EVENT_ID_DISCONNECTED		= NT_SP_E_EVENT_ID_BASE | 0x5,	/*断开连接*/NT_SP_E_EVENT_ID_NO_MEDIADATA_RECEIVED = NT_SP_E_EVENT_ID_BASE | 0x8,	/*收不到RTMP数据*/NT_SP_E_EVENT_ID_RTSP_STATUS_CODE   = NT_SP_E_EVENT_ID_BASE | 0xB,  /*rtsp status code上报, 目前只上报401, param1表示status code*//* 接下来请从0x81开始*/NT_SP_E_EVENT_ID_START_BUFFERING = NT_SP_E_EVENT_ID_BASE | 0x81, /*开始缓冲*/NT_SP_E_EVENT_ID_BUFFERING		 = NT_SP_E_EVENT_ID_BASE | 0x82, /*缓冲中, param1 表示百分比进度*/NT_SP_E_EVENT_ID_STOP_BUFFERING  = NT_SP_E_EVENT_ID_BASE | 0x83, /*停止缓冲*/NT_SP_E_EVENT_ID_DOWNLOAD_SPEED  = NT_SP_E_EVENT_ID_BASE | 0x91, /*下载速度, param1表示下载速度,单位是(Byte/s)*/NT_SP_E_EVENT_ID_PLAYBACK_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa1,     /*播放结束, 直播流没有这个事件,点播流才有*/NT_SP_E_EVENT_ID_RECORDER_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa2,     /*录像结束, 直播流没有这个事件, 点播流才有*/NT_SP_E_EVENT_ID_PULLSTREAM_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa3,   /*拉流结束, 直播流没有这个事件,点播流才有*/NT_SP_E_EVENT_ID_DURATION = NT_SP_E_EVENT_ID_BASE | 0xa8, /*视频时长,如果是直播,则不上报,如果是点播的话, 若能从视频源获取视频时长的话,则上报, param1表示视频时长,单位是毫秒(ms)*/}

10. 长期运行稳定性:大牛直播SDK提供的RTMP直播播放SDK适用于长时间运行,开源播放器对长时间运行稳定性支持较差;

11. 实时下载速度反馈:大牛直播SDK提供音视频流实时下载回调,并可设置回调时间间隔,确保实时下载速度反馈,以此来监听网络状态,开源播放器不具备此能力;

        /** 设置下载速度上报, 默认不上报下载速度* is_report: 上报开关, 1: 表上报. 0: 表示不上报. 其他值无效.* report_interval: 上报时间间隔(上报频率),单位是秒,最小值是1秒1次. 如果小于1且设置了上报,将调用失败* 注意:如果设置上报的话,请设置SetEventCallBack, 然后在回调函数里面处理这个事件.* 上报事件是:NT_SP_E_EVENT_ID_DOWNLOAD_SPEED* 这个接口必须在StartXXX之前调用* 成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetReportDownloadSpeed(IntPtr handle, Int32 is_report, Int32 report_interval);/** 主动获取下载速度* speed: 返回下载速度,单位是Byte/s* (注意:这个接口必须在startXXX之后调用,否则会失败)* 成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_GetDownloadSpeed(IntPtr handle, ref Int32 speed);

12. 异常状态处理Event状态回调如播放的过程中断网,大牛直播SDK提供的播放器可实时回调相关状态,确保上层模块感知处理,开源播放器对此支持不好;

		/** 设置事件回调,如果想监听事件的话,建议调用Open成功后,就调用这个接口*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetEventCallBack(IntPtr handle, IntPtr call_back_data, SP_SDKEventCallBack call_back);/** 设置视频大小回调接口*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetVideoSizeCallBack(IntPtr handle, IntPtr callbackdata, SP_SDKVideoSizeCallBack call_back);/** 设置视频回调, 吐视频数据出来* frame_format: 只能是NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, NT_SP_E_VIDEO_FRAME_FROMAT_I420*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetVideoFrameCallBack(IntPtr handle, Int32 frame_format,IntPtr callbackdata, SP_SDKVideoFrameCallBack call_back);/** 设置视频回调, 吐视频数据出来, 可以指定吐出来的视频宽高* handle: 播放句柄* scale_width:缩放宽度(必须是偶数,建议是 16 的倍数)* scale_height:缩放高度(必须是偶数)* scale_filter_mode: 缩放质量, 0 的话 SDK 将使用默认值, 目前可设置范围为[1, 3], 值越大 缩放质量越好,但越耗性能* frame_format: 只能是NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, NT_SP_E_VIDEO_FRAME_FROMAT_I420* 成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetVideoFrameCallBackV2(IntPtr handle,Int32 scale_width, Int32 scale_height,Int32 scale_filter_mode, Int32 frame_format,IntPtr call_back_data, SP_SDKVideoFrameCallBack call_back);/** 设置绘制视频帧时,视频帧时间戳回调* 注意如果当前播放流是纯音频,那么将不会回调,这个仅在有视频的情况下才有效*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRenderVideoFrameTimestampCallBack(IntPtr handle,IntPtr callbackdata, SP_SDKRenderVideoFrameTimestampCallBack call_back);/** 设置音频PCM帧回调, 吐PCM数据出来,目前每帧大小是10ms.*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetAudioPCMFrameCallBack(IntPtr handle,IntPtr call_back_data, SP_SDKAudioPCMFrameCallBack call_back);/** 设置用户数据回调*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetUserDataCallBack(IntPtr handle,IntPtr call_back_data, SP_SDKUserDataCallBack call_back);/** 设置视频sei数据回调*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetSEIDataCallBack(IntPtr handle,IntPtr call_back_data, SP_SDKSEIDataCallBack call_back);

13. 设置视频填充模式(等比例显示):好多情况下,有些场景需要全view铺满播放,有些为了防止视频拉伸,可以设置成等比例缩放显示;

        /** 设置视频画面的填充模式,如填充整个绘制窗口、等比例填充绘制窗口,如不设置,默认填充整个绘制窗口* handle: 播放句柄* mode: 0: 填充整个绘制窗口; 1: 等比例填充绘制窗口, 默认值是0* 成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRenderScaleMode(IntPtr handle, Int32 mode);

14. D3D检测:一般来说市面上的大多Windows都支持D3D,有些小众化的,只支持GDI模式绘制,所以为了更好的兼容性,这个接口非常必要。

		/** handle: 播放句柄* hwnd: 这个要传入真正用来绘制的窗口句柄* is_support: 如果支持的话 *is_support 为1, 不支持的话为0* 接口调用成功返回NT_ERC_OK*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_IsSupportD3DRender(IntPtr handle, IntPtr hwnd, ref Int32 is_support);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android平台RTMP/RTSP播放器开发系列之解码和绘制

本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github)。 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如果考虑到设备匹配,软…

Win7图片查看器打印不了图片怎么办

当我们想浏览电脑中的图片文件时,可以选择系统自带的图片查看器或者第三方看图工具打开,但是有些win7用户发现自己想通过windows图片查看器打印图片却没有反应,Win7图片查看器打印不了图片怎么办?就此剖,下面小编就来教教大家解决…

Android平台屏幕/摄像头或外部数据采集及RTMP推送接口设计描述

好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了。 不解释,以Android平台RTMP推送模块常用接口,看看这些接口有没有存在的意…

钉钉怎么设置考勤打卡规则

1、首先在电脑上登陆钉钉后台,然后点击如图所示的钉钉考勤打卡 钉钉后怎么设置考勤打卡规则? 2、比如一个公司生产型企业 互联网部门上班时间是 周一到周五上班时间 8:30-5:30 周六上班 8:30-12:00 以此作为案例说明 钉钉后怎么设置考勤打卡规则? 3、首先设…

变废为宝:使用废旧手机实现实时监控方案

随着手机淘汰的速度越来越快,大多数手机功能性能很强劲就不再使用了,以大牛直播SDK现有方案为例,本文探讨下,如何用废旧手机实现实时监控方案(把手机当摄像头做监控之用): 本方案需要准备一个手…

企业微信登录不了怎么办 企业微信无法登录的原因及解决方法

企业微信无法登陆怎么办?企业微信为什么登陆不了?应该怎么解决?企业微信一个很好用的基础办公沟通工具,现在很多朋友都在使用。那么,如果遇到企业微信登不上的情况应该怎么办呢?接下来小编就给大家带来企业微信无法登录的原因及解决方法,…

RTSP鉴权认证之基础认证和摘要认证

RTSP认证类型 基本认证(basic authentication):http 1.0提出的认证方案,其消息传输不经过加密转换因此存在严重的安全隐患;摘要认证(digest authentication):http 1.1提出的基本认证…

播放器之争:VLC VS SmartPlayer

好多开发者跟我们交流的时候提到,为什么有了VLC这种开源播放器,大牛直播SDK还要开发SmartPlayer?以下就针对VLC和SmartPlayer功能支持和涉及侧重,做个大概的比较: VLC VLC的全名是Video Lan Client,是一个…

网易邮箱大师如何屏蔽邮件 屏蔽垃圾邮件的方法步骤

网易邮箱大师是我们日常使用邮箱的好帮手,但是如果频频收到垃圾邮件而不知道怎么屏蔽,相信大家一定会非常烦恼,这就是今天这篇文章主要讲的内容,那么一起跟着小编往下面看看吧。 操作步骤如下: 1、打开网易邮箱大师&…

Windows平台摄像头或屏幕RTMP推送:OBS VS SmartPublisher

好多开发者问道,既然有了OBS,你们为什么还要开发SmartPublisher? 的确,在我们进行Windows平台RTMP推送模块开发之前,市面上为数不多的Windows平台RTMP推流工具当属OBS了,不得不说,OBS是一款很好…

微信公众号怎么快速导出一个月的文章数据

运营微信公众号肯定要分析文章数据,该怎么一次性导出历史文章数据呢?下面我们就来看看详细的教程。 1、在电脑上登录你的微信公众号,看到这样的页面,然后一直往下拉 微信公众号怎么快速导出一个月的文章数据? 2、在左侧导航栏的统计里面…

轻量级RTSP服务和内置RTSP网关的区别和联系

好多开发者疑惑,什么是内置RTSP网关,和轻量级RTSP服务又有什么区别和联系?本文就以上问题,做个简单的介绍: 轻量级RTSP服务 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器&am…

RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨

好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像、停止录像。 实际场景下,一个好的录像模块,2个接口远远不够, 本文以大牛直播SDK(…

Win7提示文件太大无法放入回收站怎么办

我们经常会将没有的文件拖到回收站去,但是有时候会遇到文件拖进回收站时,系统提示该文件太大无法放进回收站,那么Win7提示文件太大无法放入回收站怎么办呢?今天小编就跟大家分享Win7系统提示文件太大无法放入回收站的解决方法。 Win7提示文…

内网无纸化会议/智慧教室实时同屏RTSP组播技术方案思考

内网环境下,为了满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,好多开发者希望有RTSP的技术方案,用于小并发场景,特别是在组网环境好的有线环境下,使用RTSP服务配合组播&#xff…

Windows平台真实时毫秒级4K H264/H265直播技术方案探讨

背景 在刚提出4K视频的时候,大多数人都觉得没有必要,4K的出现,意味着更高的硬件规格和传输要求,1080P看的很爽、很清晰,完全满足了日常的需求。随着电视的尺寸越来越大,原本1080P成像已经无法满足人们对于…

Win11怎么设置电脑开机密码和锁屏密码

相信很多用户都已经用上了微软公司为大家提供的全新Win11系统了,Win11与Win10系统有很大区别,不仅仅体现在界面设计和UI上面,狠多以前Win10用户固定的功能有些取消了,有些挪位置了,这让用惯了Win10系统的用户非常不习惯…

如何在Android实现录屏直播

许多开发者在做智慧教室同屏亦或会议同屏时,基于Andriod平台采集屏幕并编码推送,往往遇到各种各样的问题,以下就我们开发过程中的一些技术考量做个分享,权当抛砖引玉: 协议选择、数据来源和处理 1. 内网环境下&#…

Win11关机后自动开机怎么办 Win11关机后自动开机的解决方法

相信有不少小伙伴已经下载了Win11操作系统进行体验了,但有一些小伙伴碰到了关机之后电脑突然又自动开机的情况,那么碰到这个问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧。 Win11关机后自动开机的解决方法 1、我们可以先在搜索框中搜索并…

Windows平台RTMP/RTSP播放器如何实现实时音量调节

为什么要做实时音量调节 RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我…