音视频的开发工作

简介:

在即时通讯应用中,根据应用场景的不同,需要对音频输入源进行选择,不同的应用场景对应不同的音频工作模式。需要支持多种音频工作(采集)模式,包括:

1、发言模式(默认):自动选择麦克风为音频输入源设备,用户说话的声音被麦克风采集,启动音频特效处理(包括:回音消除、静音检测、噪音抑制、自动增溢),该模式通常应用于互动交流,用户发言讨论等场合;

2、放歌模式:自动选择立体声混音输入源设备,本地计算机所播放的声音被采集,同时SDK内部会自动屏蔽其它用户的声音(如果不屏蔽,则用户的声音会被采集下来,并回传给用户,用户那边将会听到回音),SDK内部会自动关闭音频特效处理,该模式通常应用于向其他用户放歌,而不用关心其他用户发言的场合;

3、卡拉OK模式:自动选择立体声混音和麦克风两个输入源设备(该特性与硬件相关,有些声卡不支持同时采集麦克风和立体声混音),本地计算机所播放的声音和用户说话的声音将会被采集,同时SDK内部会自动屏蔽其它用户的声音,SDK内部会自动关闭音频特效处理,该模式通常应用于向其他用户放歌,同时自己用麦克风伴唱,而不用关心其它用户发言的场合;

4、线路输入模式:自动选择线路输入源设备,通过线路输入的声音将被采集(通常是指将外部的DV、DVD、TV等设备的音频输出端子接入声卡的LineIn口的应用),SDK内部会自动关闭音频特效处理,该模式通常应用于向其他用户播放外部设备的声音,而不需要自己讲话的场合,如向房间的所有用户直播电视信号时,可将电视的视频输出接入专用的视频采集卡,而将电视的声音输出接入声卡的LineIn接口,并选择“线路输入模式”,那么当前房间内的其它用户就可以收看到实时的电视画面与声音了。

典型修改音频工作模式的代码如下:

 

1.DWORD dwAudioMode = 1;    // 修改为放歌模式
2.BRAC_SetSDKOption(BRAC_SO_AUDIO_CPATUREMODE,(PCHAR)&dwAudioMode,sizeof(dwAudioMode));

初始化自动启动“发言模式”,如需要切换到其它的工作模式,需要通过相应的接口设置,在 初始化成功后,可动态切换,由于切换过程中,内部会自动选择对应的源设备,故切换后,上层应用需要更新当前的音频采集设备,以及对应的音频特效状态等标志。

根据模式的不同和网络状态的不同,动态调节播放缓冲区的大小,从而来控制播放延迟,如发言模式下,当网络条件好的情况下,平均延迟<300ms,当网络条件不好的情况下,平均延迟<800ms;而放歌模式等其它非发言模式,延迟将会随网络状态的变化而变化。总的来说,发言模式延迟小,保障实时性,非发言模式,如放歌模式,则延迟会稍大,保障流产性。

自动记录最后一次上层应用所选择的工作模式,下次重新运行后,会自动启用前次记录的工作模式,如果不期望SDK记录前次工作模式,则可通过关闭的配置文件来实现。

视频质量主要是通过服务器的配置文件来控制,该配置是整个系统所有房间的默认配置,早期的版本无法实现由上层应用来控制不同的用户采用不同的视频质量参数,本地视频质量控制接口,可以由上层应用控制本地视频的编码质量,为某些特定的应用提供了基础,例如:可以实现主持人发言时采用高质量的视频参数,而普通用户采集一般的视频参数,从而达到发言者的视频效果优于普通用户的特定效果。(如果采集的视频信号有“横条”干扰)

本地视频质量控制接口可以调节的参数包括“视频帧率”、“视频码率”、“视频质量”、“关键帧间隔”以及“预设参数”的控制,参数定义如下:

01.///< 本地视频编码码率设置(参数为int型,同服务器配置:VideoBitrate)
02.#define BRAC_SO_LOCALVIDEO_BITRATECTRL      30
03.///< 本地视频编码质量因子控制(参数为int型,同服务器配置:VideoQuality)
04.#define BRAC_SO_LOCALVIDEO_QUALITYCTRL      31
05.///< 本地视频编码关键帧间隔控制(参数为int型,同服务器配置:VideoGOPSize)
06.#define BRAC_SO_LOCALVIDEO_GOPCTRL          32
07.///< 本地视频编码帧率控制(参数为int型,同服务器配置:VideoFps) 
08.#define BRAC_SO_LOCALVIDEO_FPSCTRL          33
09.///< 本地视频编码预设参数控制(参数为int型,1-5)
10.#define BRAC_SO_LOCALVIDEO_PRESETCTRL       34

其中视频质量控制有两种模式“平均码率模式”(默认设置)和“质量因子模式”,当设置的码率大于0时,启动“平均码率模式”,当设置的码率为0时,启动“质量因子模式”。

典型的设置“平均码率模式”参数代码如下:

 
01.DWORD dwValue = 0;
02.// 设置本地视频编码的码率
03.dwValue = 60 * 1000;    // 60 kbps
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(const char*)&dwValue,sizeof(DWORD));
05.// 设置本地视频编码的关键帧间隔
06.dwValue = 20;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(const char*)&dwValue,sizeof(DWORD));
08.// 设置本地视频编码的帧率
09.dwValue = 8;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(const char*)&dwValue,sizeof(DWORD));
11.// 设置本地视频编码的预设参数
12.dwValue = 3;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(const char*)&dwValue,sizeof(DWORD));
14.// 使参数设置生效
15.BOOL bUseAppParam = TRUE;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(const char*)&bUseAppParam,sizeof(DWORD));

典型的设置“质量因子模式”参数代码如下:

 
01.DWORD dwValue = 0;
02.// 设置本地视频编码的码率
03.dwValue = 0;
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(const char*)&dwValue,sizeof(DWORD));
05.// 设置本地视频编码的质量因子
06.dwValue = 4;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_QUALITYCTRL,(const char*)&dwValue,sizeof(DWORD));
08.// 设置本地视频编码的关键帧间隔
09.dwValue = 20;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(const char*)&dwValue,sizeof(DWORD));
11.// 设置本地视频编码的帧率
12.dwValue = 8;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(const char*)&dwValue,sizeof(DWORD));
14.// 设置本地视频编码的预设参数
15.dwValue = 3;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(const char*)&dwValue,sizeof(DWORD));
17.// 使参数设置生效
18.BOOL bUseAppParam = TRUE;
19.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(const char*)&bUseAppParam,sizeof(DWORD));

当启动“平均码率模式”时,质量因子的参数设置仍然有效,只是系统会限制输出的最高码率。另外要使设置的参数生效,需要调用“BRAC_SetSDKOption”接口并使用“BRAC_SO_LOCALVIDEO_APPLYPARAM”标志启用所设置的参数,同时也可利用该标志恢复服务器配置的默认视频质量参数。

关于视频帧率关键帧间隔的参数设置可参考如下原则:

1、帧率越高,视频越流畅(最大值为25fps),同时帧率也会对码率和CPU资源占用产生一定的影响,通常的建议是互联网应用(8-12fps),局域网应用(18-25fps);

2、关键帧间隔是指在编码的过程中,两个关键帧之间非关键帧的数量,值越大,码率越小,但会降低视频的质量,值越小,码率越大,视频质量较好,但不宜过小,通常的建议是互联网应用(帧率的3、4倍),局域网应用(等于帧率),不要小于帧率;

关于本地视频编码的预设参数:BRAC_SO_LOCALVIDEO_PRESETCTRL,其取值范围为1-5,主要用来控制CPU资源占用率和画面细节,值越小,编码时的CPU占用率越低,但会损失对画面细节的处理;值越大,编码时的CPU占用率越高,但对画面细节的处理会更细腻,该参数主要针对高码率有效,低码率时由于码率的限制,视频画面细节无法表现出来,所以低码率模式下,可以将该参数调节低一些,以降低CPU的利用率。

关于本地视频编码的码率参数:BRAC_SO_LOCALVIDEO_BITRATECTRL,单位为bps,码率越小,视频质量越差;码率越高,视频质量越好,同时该参数还与视频画面的分辩率有关,不同的分辨率有不同的取值范围,如在互联网应用状态下,分辩率是176x144典型的取值范围是(10kbps ~ 60kbps),分辨率是320x240典型的取值范围是50kbps ~ 120kbps,如果是局域网应用,则码率可适当提高。

关于本地视频编码的质量因子参数:BRAC_SO_LOCALVIDEO_QUALITYCTRL,取值范围为1-6,值越小,画面质量越低,输出码率也越低,值越大,画面质量越高,输出码率也越高。

关于“平均码率模式”和“质量因子模式”两种视频质量控制模式的区别和应用,可参考如下原则:

1、“平均码率模式”:视频编码时以输出码率为优先考虑条件,当画面静止时,输出的码率较低,动态画面码率会较高,瞬时码率可能会超过设置的参数(最高不会超过10%),但是其输出的视频数据平均码率将会维持在设置的参数附近,当画面运动量过大时,编码器为了维持平均码率,将会损失画面的质量,通常互联网应用可采用该模式;

2、“质量因子模式”:当码率参数设置为0时,该模式生效,视频编码时以视频质量为优先考虑条件,静止的画面和动态画面将会用不同的量化因子进行编码,维持在一个固定的画面质量下,当画面静止时,码率较低,当画面运动时,码率较高,通常局域网应用可采用该模式。由于该模式下没有限制码率,所以大运动量画面时,为了保持固定的画面质量,码率的变化将会比较大,所以该模式不适合于互联网应用。

3、如果希望在互联网的环境下获得较高质量的视频效果(在网络带宽许可的情况下),建议采用“平均码率模式”,只是可以适当提高视频质量参数(VideoQuality)的值,视频码率参数根据需要进行设置。低码率,配置较低的视频质量,高码率就需要配置较高的视频质量。




本文转自 fanxiaojun 51CTO博客,原文链接:http://blog.51cto.com/2343338/512396,如需转载请自行联系原作者

相关文章
|
4月前
|
网络协议 Linux 测试技术
音视频学习之rtsp推流学习1(rtspserver开源库example运行及流程梳理)
音视频学习之rtsp推流学习1(rtspserver开源库example运行及流程梳理)
132 0
|
7月前
|
存储 边缘计算 负载均衡
直播APP源码搭建:核心的服务器系统
这就是直播APP源码平台的服务器系统,拥有着管理用户、数据、直播流质量与带宽等优秀的能力,是直播APP源码平台正常运行提供服务和用户优质体验的重要支撑,服务器系统可以说是直播APP源码平台的重要核心。
直播APP源码搭建:核心的服务器系统
|
7月前
|
编解码 运维 安全
直播系统源码,系统分析篇:不可或缺的云转码系统
云转码系统作为直播系统源码平台不可或缺的系统之一,它的根据不同设备终端与网络状况等因素变换质量,让平台用户能够在不同的时间和地点享受到高清、低延迟的优质体验,并且可以在多种场景中起到关键的作用,云转码系统使直播系统源码平台具有广泛的应用前景和价值。
直播系统源码,系统分析篇:不可或缺的云转码系统
|
7月前
|
编解码 Java 开发工具
[技术分享]Android平台实时音视频录像模块设计之道
录像有什么难的?无非就是数据过来,编码保存mp4而已,这可能是好多开发者在做录像模块的时候的思考输出。是的,确实不难,但是做好,或者和其他模块有非常好的逻辑配合,确实不容易。
|
安全 iOS开发
J2L3x 即时通讯与常用的视频剪辑软件集成方便协同和沟通
如果想把视频软件集成到即时通讯软件中,更好的协同工作,建议可以使用 J2L3x 即时通讯软件。
J2L3x 即时通讯与常用的视频剪辑软件集成方便协同和沟通
|
存储 测试技术 文件存储
HLS开发学习-09- 描述高效的C测试平台
HLS开发学习-09- 描述高效的C测试平台
655 0
HLS开发学习-09- 描述高效的C测试平台
|
缓存 算法 数据库
在线直播系统源码,围绕缓存做了哪些工作?
在线直播系统源码,围绕缓存做了哪些工作?
|
编解码 iOS开发 异构计算
直播软件APP开发,哪些功能应该作为开发重点
直播软件APP开发的优点不必多说,从娱乐方式到带货方式,直播软件改变了我们的生活,同时也吸引了很多想要靠直播赚钱的朋友
2882 0
|
存储 数据采集 编解码
直播软件开发推流过程详解
直播过程 1.相机预览及数据采集Camera — 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera))  2.原始帧处理(Rotate旋转/Scale缩放:使用Libyuv/FFmpeg等工具库)  3.编码器编码得到相应的h24数据(openh264库编码)  4.发送给流媒体服务器 (librtmp库推流)  5.服务器接受及转发
|
数据采集 编解码 算法
直播代码,在音视频技术方面的运作有这些
直播代码的直播数据处理分为五步:数据采集、编码、传输、解码和渲染。我们今天主要来说一下传输中的音视频方面的知识。
507 0
直播代码,在音视频技术方面的运作有这些