x264直播(5) - 音频录制与编码faac
x264直播继续, 直播视频已经OK, 继续音频部分
- 音频录制可以 使用 IAudioCaptureClient 系列接口, 参考MSDN, 上面还有示例
- 可以录制电脑播放的声音, 也可以录制MIC输入的声音, 不同选择参数在函数 IMMDeviceEnumerator.GetDefaultAudioEndpoint, IAudioClient.Initialize
录制回放 用 dataFlow = eRender; StreamFlags = AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_NOPERSIST;
录制MIC 用 dataFlow = eCapture; StreamFlags = 0; - 主要一个问题 IAudioCaptureClient.GetBuffer 函数在使用前必须先调用 IAudioCaptureClient.GetNextPacketSize , 再循环读取, 否则数据会丢失
for(; adcp->close==false; )
{
hr = pCaptureClient->GetNextPacketSize(&uFramesNext);
if(uFramesNext == 0)
{
Sleep(delay/2);
continue;
}
hr = pCaptureClient->GetBuffer(&pItemBuf, &uFrames, &dwFlag, NULL, NULL);
if(dwFlag)
dbg_trace("GetBuffer flag: %d", dwFlag);
uItemSize = uFrameSize * uFrames;
ret = adcp->back(adcp, pItemBuf, uItemSize, uFrames);
if(ret)
break;
hr = pCaptureClient->ReleaseBuffer(uFrames);
}
-
IAudioCaptureClient 录音时无声时无数据, 导致时序不对, 可以另外开一个线程播放空声音来阻止这个问题
-
faac可以从github下载, vs编译方式参考前面的方法, 里面还有示例
-
运行时发生错误 0xC0000005, 发生在sse指令, 原因是数据没有对齐导致错误, 添加对齐 _CRT_ALIGN(16)
-
IAudioCaptureClient 录制的数据是-1.0到1.0 faac输入需要是0x0000 - 0xFFFF, 所以需要转换
sample_read = read_size / bytes_sample;
wave_val = (float *)aac->buf_in;
for(k=0; k<sample_read; k++) // WAVE_FORMAT_EXTENSIBLE 是-1.0 1.0
{
wave_val[k] = wave_val[k] * 0x8000; // 转换
}
最终可以录制声音成一个aac文件, 用播放器可以播放了