美文网首页
webrtc之视频设备枚举及封装

webrtc之视频设备枚举及封装

作者: hijiang | 来源:发表于2019-07-19 10:43 被阅读0次

    有一小段时间没研究webrtc,写点笔记。
    webrtc的视频设备处理,基本都在VideoCatpureFactory中(它会根据不同的平台:window,linux,ios,android,生成不同的VideoCaptureModule 对象);
    我们封装出一个VideoDeviceManager单例对象,该对象可以实现:

    • 视频设备枚举
    • 视频设备支持格式查询
      在webrtc中,设备主要使用设备id标识一个设备,而device_name为设备名称(中文或英文都可),并将视频设备抽象表示如下:
    //视频设备支持的格式信息,暂时只提取如下
    struct VideoFormat {
        size_t width;
        size_t height;
        size_t interval;
    };
    
    class VideoDevice {
    public:
        VideoDevice(const std::string& id, const std::string& name) :device_id(id), device_name(name) {
            }
    public:
        std::string device_id;
        std::string device_name;
    
        std::vector<VideoFormat> support_formats;
    };
    

    设备集合:

    class VideoDeviceCollection
    {
    public:
        VideoDeviceCollection();
        virtual ~VideoDeviceCollection();
    
        size_t getCount();
    
        int getDevice(int index, std::string& deviceName, std::string& deviceId);
    
        std::shared_ptr<VideoDevice> getDevice(size_t index);
        std::shared_ptr<VideoDevice> searchDevice(const std::string& deviceId);
    private:
        void addVideoDevice(std::shared_ptr<VideoDevice> device);
    
        std::vector<std::shared_ptr<VideoDevice>> video_devices_;
    
        friend class XXX::VideoDeviceManager;
    };
    

    枚举设备的方法(返回设备集合):

    std::shared_ptr<XXX_PUBLIC::VideoDeviceCollection> VideoDeviceManager::enumerateVideoDevices()
    {
        std::unique_ptr<webrtc::VideoCaptureModule::DeviceInfo> info(webrtc::VideoCaptureFactory::CreateDeviceInfo());
        if (!info) {
            return nullptr;
        }
        int num_devices = info->NumberOfDevices();
        for (int i = 0; i < num_devices; ++i) {
            const uint32_t kSize = 256;
            char name[kSize] = { 0 };
            char id[kSize] = { 0 };
            if (info->GetDeviceName(i, name, kSize, id, kSize) != -1) {
                std::shared_ptr<XXX_PUBLIC::VideoDevice> device = std::make_shared<XXX_PUBLIC::VideoDevice>(id, name);
                getVideoFormat(device);
                if (device->support_formats.size() <= 0) {
                    continue;
                }
                video_collection_->addVideoDevice(device);
            }
        }
        return video_collection_;
    }
    

    获取某个设备支持的格式消息:

    void VideoDeviceManager::getVideoFormat(std::shared_ptr<XXX_PUBLIC::VideoDevice>video_device)
    {
        cricket::WebRtcVideoDeviceCapturerFactory factory;
        std::unique_ptr<cricket::VideoCapturer> capturer;//这里这个轨道用来采集,不输入,输入创建一个新的ExternalCapturer;
        capturer = factory.Create(cricket::Device(video_device->device_name, video_device->device_id));
        if (!capturer) {
            return;
        }
    
        video_device->support_formats.clear();
        const std::vector<cricket::VideoFormat> *formats = capturer->GetSupportedFormats();
        for (const auto video_format : *formats) {
            XXX_PUBLIC::VideoFormat format;
            format.width = video_format.width;
            format.height = video_format.height;
            format.interval = video_format.interval;
            video_device->support_formats.push_back(format);
        }
    }
    

    至于这个模块的运作机制,以后写。

    相关文章

      网友评论

          本文标题:webrtc之视频设备枚举及封装

          本文链接:https://www.haomeiwen.com/subject/ovtjlctx.html