媒体流配置
1、视频配置
1.1、枚举摄像头列表及其采集属性
视频设备属性结构体 CameraDeviceInfo
/**
* 摄像头采集属性
*/
typedef struct _TCameraCapability
{
int width;
int height;
int max_fps;
VideoCaptureType video_type;
} CameraCapability;
typedef std::vector<CameraCapability> CameraCapabilityVec;
/**
* 摄像头基本信息及其支持的采集属性
*/
typedef struct _TCameraDeviceInfo
{
std::string device_id;
std::string device_name;
CameraCapabilityVec capability_vec;
}CameraDeviceInfo;
以上可通过 QNRTCVideo::GetCameraInfo(uint32_t device_index_)
获取;
注:接口 GetCameraCount()
内部会进行一次设备枚举操作,比较耗时;如果用户进行了设备的插拔操作,则开发者可以通过重复调用 GetCameraCount()
接口获取新的设备数量,否则不建议频繁调用 GetCameraCount()
进行枚举。
目前市面上普通的 PCI 接口的采集卡(外接摄像头),只要系统将其识别为视频采集设备,则 SDK 便可以枚举并采集。
1.2、视频参数配置
通过 CameraSetting
设置指定摄像头设备信息和采集(同编码)尺寸、帧率、码率以及预览窗口句柄:
typedef struct _TCameraSetting
{
std::string device_id;
std::string device_name;
int width = 640; // 宽度
int height = 480; // 高度
int max_fps = 15; // 帧率:默认为 15fps
int bitrate = 300000; // 视频码率,单位:bps
void* render_hwnd = nullptr; // 视频渲染窗口句柄,如果为空,则不再渲染,但不影响 YUV 数据的回调
}CameraSetting;
注:需在视频预览或发布前,调用 QNRTCVideo::SetCameraParams(CameraSetting& camera_setting_)
进行配置,连麦过程中调用无效;
其中 width
和 height
参数需指定设备属性中 CameraDeviceInfo
所支持的宽高参数,否则预览、发布将会失败。
bitrate
表示在正常网络情况下,视频码率将会在此配置上下浮动,网络较差时将适当的降低码率;如果配置为 0,则默认为 600kbps,同时根据网络情况在 100 ~ 2000 kbps 范围内调节。
1.3、图像处理
SDK 提供以下几种视频图像处理接口,在 QNRTCVideo
接口类中定义
图像裁减
// 裁减原始图像数据,目前仅支持 I420 格式
// @param src_data_ 原始图像数据内存指针
// @param src_width_ 原始图像宽度
// @param src_height_ 原始图像高度
// @param src_data_size_ src_data_ 内存数据长度
// @param picture_fmt_ src_data_ 数据色彩空间格式,目前仅支持 kI420
// @param mirror_flag_ 是否将原始图像镜像后再进行裁剪
// @param origin_x_ 裁剪原点横坐标,起点为 左上角
// @param origin_y_ 裁剪原点纵坐标,起点为 左上角
// @param dest_width_ 裁剪图像目标宽度
// @param dest_height_ 裁剪图像目标高度
// @param dest_data_ 裁剪图像目标内存指针地址,由外部进行管理
// @param max_dest_data_size_ 目标内存的容量
// @param dest_data_size_ 输出图像最终内存大小,为输出参数
// @return 成功返回 0
virtual int CropRawPicture(
unsigned char* src_data_,
const unsigned int& src_width_,
const unsigned int& src_height_,
const unsigned int& src_data_size_,
qiniu::VideoCaptureType picture_fmt_,
bool mirror_flag_,
const int& origin_x_,
const int& origin_y_,
const int& dest_width_,
const int& dest_height_,
unsigned char* dest_data_,
const unsigned int& max_dest_data_size_,
__out unsigned int& dest_data_size_
) = 0;
图像格式转换
// 转换色彩空间格式为 kI420,目前支持的格式有: kRGB24,kABGR,kARGB,kBGRA
// @param src_data_ 原始图像内存指针地址
// @param src_width_ 原始图像宽度
// @param src_height_ 原始图像高度
// @param src_data_size_ 原始图像内存大小
// @param src_picture_fmt_ 原始图像色彩空间格式
// @param dest_data_ 目标内存指针地址
// @param max_dest_data_size_ 目标内存的容量
// @param dest_data_size_ 目标内存大小,为输出参数
// @return return 0 if success, or an error code
virtual int ConvertToI420(
unsigned char* src_data_,
const unsigned int& src_width_,
const unsigned int& src_height_,
const unsigned int& src_data_size_,
qiniu::VideoCaptureType src_picture_fmt_,
unsigned char* dest_data_,
const unsigned int& max_dest_data_size_,
__out unsigned int& dest_data_size_
) = 0;
视频渲染方式配置
// 配置是否使用 D3D 渲染视频,D3D 默认为激活状态,否则为 GDI 渲染方式
// @param enable_d3d_ 激活或者取消
//
virtual void EnableD3dRender(bool enable_d3d_ = true) = 0;
2、音频配置
2.1、音频设备枚举
音频设备信息结构体:
/**
* Audio device information
*/
typedef struct _TAudioDeviceInfo
{
enum AudioDeviceType
{
adt_invalid = -1,
adt_record,
adt_playout,
};
unsigned int device_index;
AudioDeviceType device_type = adt_invalid;
char device_name[QNRTC_MAX_DEVICE_LENGHT] = { 0 };
char device_id[QNRTC_MAX_DEVICE_LENGHT] = { 0 };
}AudioDeviceInfo;
以上可通过 QNRTCAudio::GetAudioDeviceInfo( AudioDeviceInfo::AudioDeviceType device_type_, unsigned int device_index_, __out AudioDeviceInfo& audio_info_)
进行获取,如:
// 枚举音频采集设备列表
int audio_rec_count = _rtc_audio_interface->GetAudioDeviceCount(AudioDeviceInfo::adt_record);
for (int i(0); i < audio_rec_count; ++i) {
AudioDeviceInfo audio_info;
if (_rtc_audio_interface->GetAudioDeviceInfo(AudioDeviceInfo::adt_record, i, audio_info) == 0) {
...
);
}
}
// 枚举音频播放设备列表
int audio_play_count = _rtc_audio_interface->GetAudioDeviceCount(AudioDeviceInfo::adt_playout);
for (int i(0); i < audio_play_count; ++i) {
AudioDeviceInfo audio_info;
if (_rtc_audio_interface->GetAudioDeviceInfo(AudioDeviceInfo::adt_playout, i, audio_info) == 0) {
...
}
}
2.2、音频设备配置
SDK 目前支持指定特定的音频输入、输出设备进行连麦,相关控制接口为:
typedef struct _TAudioDeviceSetting
{
enum WindowsDeviceType
{
wdt_DefaultCommunicationDevice = -1,
wdt_DefaultDevice = -2
};
unsigned int device_index; //speaker or playout device index
WindowsDeviceType device_type = wdt_DefaultDevice;
}AudioDeviceSetting;
// 指定音频输入设备进行连麦
virtual int SetRecordingDevice(AudioDeviceSetting recording_device_setting_) = 0;
// 指定音频输出设备进行连麦
virtual int SetPlayoutDevice(AudioDeviceSetting playout_device_setting_) = 0;
注:通话过程中指定设备无效,需在通话开始前进行相关操作,如果没有指定,将使用系统默认的设备(非默认通信设备);
2.3 音量配置
// 获取系统设备的音量
// @param device_type_ audio device type: recording or playout
// @return return audio volume: 0 ~ 100
virtual int GetAudioVolume(AudioDeviceInfo::AudioDeviceType device_type_) = 0;
// 设置系统设备的音量
// @param device_type_ audio device type: recording or playout
// @param volume_ audio volume : 0 ~ 100
// @return return 0 if success or an error code
virtual int SetAudioVolume(AudioDeviceInfo::AudioDeviceType device_type_, int volume_) = 0;
// 设置指定用户的音量,不影响系统设备
// @param user_id_ user id
// @param volume_ audio volume, 0 ~ 100
// @return return 0 if success or an error code
virtual int SetAudioVolume(const std::string& user_id_, double volume_) = 0;
// 获取指定用户音量的分贝值
// @param user_id_ who's audio level
// @return 0 ~ 100,audio level >= 0 if success, else return -1
virtual unsigned int GetAudioLevel(const std::string& user_id_) = 0;
2.4 监听
监听功能为在开启麦克风采集时,同时开启系统声音(桌面声音)的采集,同时将两种进行混音,然后通过 RTN 进行传输,此接口仅在使用 SDK 内部采集时才有效;
注:此功能目前仅在单路发布时音质较好,如果是在多用户同时发布音频的场景下,音质较差,请谨慎使用。
// 开关监听功能,此接口非线程安全接口,在 Publish 之后调用激活,UnPublish 之后调用取消
// @param enable_ 是否开关监听功能
// @param volume_scale_ratio_ 系统声音音量在与麦克风音量混音时的调整,默认为 1.0,即不变
// @return return 0 if success or an error code
virtual int MixDesktopAudio(bool enable_, float volume_scale_ratio_ = 1.0f) = 0;