WebRTC专题开嗨鸭 !!!
一、 WebRTC 线程模型
1、WebRTC中线程模型和常见线程模型介绍
2、WebRTC网络PhysicalSocketServer之WSAEventselect模型使用
二、 WebRTC媒体协商
三、 WebRTC 音频数据采集
1、WebRTC源码之音频设备播放流程源码分析
2、WebRTC源码之音频设备的录制流程源码分析
四、 WebRTC 音频引擎(编解码和3A算法)
五、 WebRTC 视频数据采集
六、 WebRTC 视频引擎( 编解码)
七、 WebRTC 网络传输
1、WebRTC的ICE之STUN协议
2、WebRTC的ICE之Dtls/SSL/TLSv1.x协议详解
八、 WebRTC服务质量(Qos)
1、WebRTC中RTCP协议详解
2、WebRTC中RTP协议详解
3、WebRTC之NACK、RTX 在什么时机判断丢包发送NACK请求和RTX丢包重传
4、WebRTC源码之视频质量统计数据的数据结构分析
九、 NetEQ
十、 Simulcast与SVC
①、低延迟
②、提高了可靠性,API从内核层移到了用户层
③、安全性更高
等等…
MMDevice API
WAS API
DeviceTopology API
EndpointVolume API
Core Audio 有两种模式: 同享模式和独享模式
分下面四种API
两个COM对象能实现相同的接口
通过CLSID找到组件
通过IID找到COM组件种的接口
每个COM组件对象可以实现多个接口
等等
状态 | 默认值 | 作用 |
---|---|---|
_playing | false | 是否处于播放状态 |
_playIsinitialized | false | 是否对播放参数进行了设置 |
_buildInAecEnabled | false | 是否启用了硬件AEC功能 |
_recIsInitiaized | false | 是否对录录制参数进行了设备 |
_recording | false | 是否处理录制状态 |
_speakerIsInitialized | false | 是否对扬声器进行了初始化 |
_microphoneIsIntialized | false | 是否对microphone进行了初始化 |
/* general extended waveform format structure
Use this for all NON PCM formats
(information common to all formats)
*/
#ifndef _WAVEFORMATEX_
#define _WAVEFORMATEX_
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* 设置声音格式类型 PCM format type */
WORD nChannels; /* 设置通道数 number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* 设置采样率 sample rate */
DWORD nAvgBytesPerSec; /* 设置每秒平均字节数 for buffer estimation */
WORD nBlockAlign; /* 设置对齐字节数 block size of data */
WORD wBitsPerSample; /*设置每个采样的大小(位深) Number of bits per sample of mono data */
WORD cbSize; /* 额外消息大小 The count in bytes of the size of
extra information (after cbSize) */
} WAVEFORMATEX;
typedef WAVEFORMATEX *PWAVEFORMATEX;
typedef WAVEFORMATEX NEAR *NPWAVEFORMATEX;
typedef WAVEFORMATEX FAR *LPWAVEFORMATEX;
#endif /* _WAVEFORMATEX_ */
#ifdef GUID_DEFINED
MIDL_INTERFACE("1CB9AD4C-DBFA-4c32-B178-C2F568A703B2")
IAudioClient : public IUnknown
{
public:
// TODO@chensong 2022-07-24 初始化音频流
///
/**
* @param AUDCLNT_SHAREMODE : 共享模式/独占模式
* @param DWORD : 控制流创建的flag
* @param REFERENCE_TIME : 请求缓冲区的大小
* @param REFERENCE_TIME : 周期时间
* @param WAVEFORMATEX : 数据格式
* @param LPCGUID : Audio Session 的 GUID
* @return
*/
/
// StreamFlags 参数类型解释:
// AUDCLNT_STREAMFLAGS_LOOPBACK :
// AUDCLNT_STREAMFLAGS_EVENTCALLBACK :
// ...
virtual HRESULT STDMETHODCALLTYPE Initialize(
/* [annotation][in] */
_In_ AUDCLNT_SHAREMODE ShareMode,
/* [annotation][in] */
_In_ DWORD StreamFlags,
/* [annotation][in] */
_In_ REFERENCE_TIME hnsBufferDuration,
/* [annotation][in] */
_In_ REFERENCE_TIME hnsPeriodicity,
/* [annotation][in] */
_In_ const WAVEFORMATEX *pFormat,
/* [annotation][in] */
_In_opt_ LPCGUID AudioSessionGuid) = 0;
virtual HRESULT STDMETHODCALLTYPE GetBufferSize(
/* [annotation][out] */
_Out_ UINT32 *pNumBufferFrames) = 0;
virtual HRESULT STDMETHODCALLTYPE GetStreamLatency(
/* [annotation][out] */
_Out_ REFERENCE_TIME *phnsLatency) = 0;
virtual HRESULT STDMETHODCALLTYPE GetCurrentPadding(
/* [annotation][out] */
_Out_ UINT32 *pNumPaddingFrames) = 0;
virtual HRESULT STDMETHODCALLTYPE IsFormatSupported(
/* [annotation][in] */
_In_ AUDCLNT_SHAREMODE ShareMode,
/* [annotation][in] */
_In_ const WAVEFORMATEX *pFormat,
/* [unique][annotation][out] */
_Out_opt_ WAVEFORMATEX **ppClosestMatch) = 0;
virtual HRESULT STDMETHODCALLTYPE GetMixFormat(
/* [annotation][out] */
_Out_ WAVEFORMATEX **ppDeviceFormat) = 0;
virtual HRESULT STDMETHODCALLTYPE GetDevicePeriod(
/* [annotation][out] */
_Out_opt_ REFERENCE_TIME *phnsDefaultDevicePeriod,
/* [annotation][out] */
_Out_opt_ REFERENCE_TIME *phnsMinimumDevicePeriod) = 0;
virtual HRESULT STDMETHODCALLTYPE Start( void) = 0;
virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0;
virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0;
virtual HRESULT STDMETHODCALLTYPE SetEventHandle(
/* [in] */ HANDLE eventHandle) = 0;
/
// TODO@chensong 2022-07-24 GetService 方法解释
/**
*
* @param rrid : 接口ID
* @param ppv : 输出的接口对象
* return STDMETHODCALLTYPE
*/
virtual HRESULT STDMETHODCALLTYPE GetService(
/* [annotation][in] */
_In_ REFIID riid,
/* [annotation][iid_is][out] */
_Out_ void **ppv) = 0;
};
音频流的访问方式
WebRTC源码中音频流初始化在 modules/audio_device/win/audio_device_core_win.cc文件中InitPlayout方法中调用的音频流初始化方法Initialize
...
// TODO@chensong 2022-07-24 初始化音频流
///
/**
* @param AUDCLNT_SHAREMODE : 共享模式/独占模式
* @param DWORD : 控制流创建的flag
* @param REFERENCE_TIME : 请求缓冲区的大小 [是与时间有关系的哈]
* @param REFERENCE_TIME : 周期时间 [10ms采集一次、 20ms采集一次]
* @param WAVEFORMATEX : 数据格式
* @param LPCGUID : Audio Session 的 GUID
* @return
*/
/
// StreamFlags 参数类型解释:
// AUDCLNT_STREAMFLAGS_LOOPBACK :
// AUDCLNT_STREAMFLAGS_EVENTCALLBACK :
// ...
hr = _ptrClientOut->Initialize(
AUDCLNT_SHAREMODE_SHARED, // share Audio Engine with other applications
AUDCLNT_STREAMFLAGS_EVENTCALLBACK, // processing of the audio buffer by
// the client will be event driven
hnsBufferDuration, // requested buffer capacity as a time value (in
// 100-nanosecond units)
0, // periodicity
&Wfx, // selected wave format
NULL); // session GUID
if (FAILED(hr)) {
RTC_LOG(LS_ERROR) << "IAudioClient::Initialize() failed:";
}
...
WebRTC源码中音频流初始化在 modules/audio_device/win/audio_device_core_win.cc文件中InitPlayout方法中调用的音频流初始化方法GetService
...
/
// TODO@chensong 2022-07-24 GetService 方法解释
/**
*
* @param rrid : 接口ID
* @param ppv : 输出的接口对象
* return STDMETHODCALLTYPE
*/
// Get an IAudioRenderClient interface.
SAFE_RELEASE(_ptrRenderClient);
hr = _ptrClientOut->GetService(__uuidof(IAudioRenderClient),
(void**)&_ptrRenderClient);
EXIT_ON_ERROR(hr);
...
WebRTC源码分析地址:https://github.com/chensongpoixs/cwebrtc