x264直播(5) - 音频录制与编码faac

x264直播继续, 直播视频已经OK, 继续音频部分

  1. 音频录制可以 使用 IAudioCaptureClient 系列接口, 参考MSDN, 上面还有示例
  2. 可以录制电脑播放的声音, 也可以录制MIC输入的声音, 不同选择参数在函数 IMMDeviceEnumerator.GetDefaultAudioEndpoint, IAudioClient.Initialize
    录制回放 用 dataFlow = eRender; StreamFlags = AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_NOPERSIST;
    录制MIC 用 dataFlow = eCapture; StreamFlags = 0;
  3. 主要一个问题 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);
}
  1. IAudioCaptureClient 录音时无声时无数据, 导致时序不对, 可以另外开一个线程播放空声音来阻止这个问题

  2. faac可以从github下载, vs编译方式参考前面的方法, 里面还有示例

  3. 运行时发生错误 0xC0000005, 发生在sse指令, 原因是数据没有对齐导致错误, 添加对齐 _CRT_ALIGN(16)

  4. 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文件, 用播放器可以播放了

posted @ 2020-11-06 11:51  Yofoo  阅读(341)  评论(0编辑  收藏  举报