【发布时间】:2017-07-23 03:28:52
【问题描述】:
我一直在使用 IAudioCaptureClient 从我的音频输出设备收集数据并使用正在工作的 mmioWrite 将其记录到一个文件中,但我也想将此数据转储到 stdout,以便能够流式传输它。我正在使用 fprintf,但输出数据与写入的文件中的数据并不完全相同,即使它来自同一个缓冲区,这两个文件似乎 98% 相同。
以下是相关代码:
BYTE *pData;
...
// Here pData is bufferized with data from my output device
pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL);
...
LONG lBytesWritten = mmioWrite(hFile, reinterpret_cast<PCHAR>(pData), lBytesToWrite);
fprintf(stdout, "%.*s", lBytesWritten, pData);
...
// I've also tried
// HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
// WriteConsole(hStdOut, reinterpret_cast<PCHAR>(pData), lBytesWritten, NULL, NULL);
【问题讨论】:
-
printf*采用int,而不是LONG。 -
stdout默认以文本模式打开,因此此流将在 Windows 中将\n转换为\r\n。如果您的数据可能包含任意字节,您将不得不对此做一些事情,例如不使用stdout,或者以二进制模式重新打开 -
可能是这样,以二进制模式重新打开stdin,我会搜索如何做到这一点
-
我实际上误认为这两个文件都像 98%,实际上它们完全不同,并且 printf 错过了很多信息。这就像 printf 太慢并且无法继续使用 mmioWrite 所以我添加了 100 mili 的睡眠,但它没有解决问题,这不是多线程问题,因为它们在同一个线程上运行,所以文本不会从一个对另一个。 stdout 中的所有文本都包含在 mmioWrite 中,但不是其他的。
-
哦,我添加了
_setmode(_fileno(stdout), _O_BINARY);来生成标准输出的二进制输出,但结果是一样的。
标签: c++ visual-c++ stdout