实时音视频云

  • 媒体流配置

    最近更新时间:2018-11-27 18:34:06

    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_) 进行配置,连麦过程中调用无效;
    其中 widthheight 参数需指定设备属性中 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;
    
    以上内容是否对您有帮助?
  • Icon free helper
    Close