Попытка захватить звук с помощью C ++ и Nodejs, но не запечатлевается звук [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Попытка захватить звук с помощью C ++ и Nodejs, но не запечатлевается звук [закрыто]

Сообщение Anonymous »

Попытка захватить аудио из существующего процесса с помощью PID. Регулирование OBS Audio Capture OpenSource, я сделал capture.cpp < /p>

Код: Выделить всё

const fs = require('fs');
const capture = require('bindings')('capture');

const targetPid = 20744;

const out = fs.createWriteStream('dump.pcm');

console.log(`Capturing audio from PID ${targetPid} for 5 seconds...`);
capture.startCapture(targetPid, chunk => {
if (Buffer.isBuffer(chunk)) {
out.write(chunk);
} else {
console.log('[native]', chunk);
}
});
const sessions = capture.listSessions();
sessions.forEach(s => {
console.log(`PID: ${s.pid}\tEXE: ${s.path}`);
});

setTimeout(() => {
capture.stopCapture();
out.end(() => {
console.log('generated dump.pcm');
console.log(`file size: ${fs.statSync('dump.pcm').size} bytes`);
});
}, 5000);
< /code>
Это мой код JS для отладки. Когда я его выполняю, я получаю информацию об этом отладке. < /P>
E:\projects\YTM_Stream\electron-quick-start>node capture-test.js
Capturing audio from PID 20744 for 5 seconds...
[Native] Starting capture: PID=20744
PID: 20744      EXE: C:\Program Files\WindowsApps\Microsoft.ZuneMusic_11.2504.4.0_x64__8wekyb3d8bbwe\Microsoft.Media.Player.exe
PID: 0  EXE: 
[native] Capture started
generated dump.pcm
file size: 0 bytes
< /code>
В основном он должен захватить звук Windows Media Player в течение 5 секунд, но он генерирует только пустой файл. Он не генерирует ошибки, но не результатов тоже. < /P>
Функция захвата выглядит так.  < /P>
void CaptureAudioLoopByPID(DWORD pid, const std::wstring& exePath) {
std::wcout GetSession(i, &ctrl))) continue;
IAudioSessionControl2* ctrl2 = nullptr;
if (FAILED(ctrl->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&ctrl2))) { ctrl->Release(); continue; }
ctrl->Release();

DWORD sessionPid = 0;
ctrl2->GetProcessId(&sessionPid);
if (sessionPid == pid) { pTargetCtrl = ctrl2; break; }
ctrl2->Release();
}
if (!pTargetCtrl) {
tsfn.BlockingCall([](Napi::Env env, Napi::Function cb) { cb.Call({ Napi::String::New(env, "No session for PID") }); });
goto cleanup;
}

if (FAILED(pTargetCtrl->QueryInterface(__uuidof(IAudioClient), (void**)&pAudioClient))) goto cleanup;
pTargetCtrl->Release();
if (FAILED(pAudioClient->GetMixFormat(&pwfx))) goto cleanup;
if (FAILED(pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK, 0, 0, pwfx, nullptr))) goto cleanup;
if (FAILED(pAudioClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pCaptureClient))) goto cleanup;
if (FAILED(pAudioClient->Start())) goto cleanup;

capturing = true;
while (capturing) {
UINT32 packetLen = 0;
if (FAILED(pCaptureClient->GetNextPacketSize(&packetLen))) break;
while (packetLen > 0) {
BYTE* data = nullptr;
UINT32 frames = 0;
DWORD flags = 0;
if (FAILED(pCaptureClient->GetBuffer(&data, &frames, &flags, nullptr, nullptr))) break;

UINT32 bytes = frames * pwfx->nBlockAlign;
std::vector pcm(data, data + bytes);
pCaptureClient->ReleaseBuffer(frames);

if (!pcm.empty()) {
napi_status st = tsfn.NonBlockingCall([pcm = std::move(pcm)](Napi::Env env, Napi::Function cb) {
cb.Call({ Napi::Buffer::Copy(env, pcm.data(), pcm.size()) });
});
if (st == napi_queue_full) Sleep(5);
}

if (FAILED(pCaptureClient->GetNextPacketSize(&packetLen))) break;
}
Sleep(10);
}

pAudioClient->Stop();

cleanup:
if (pwfx) CoTaskMemFree(pwfx);
if (pCaptureClient) pCaptureClient->Release();
if (pAudioClient) pAudioClient->Release();
if (pSessEnum)  pSessEnum->Release();
if (pMgr)      pMgr->Release();
if (pDevice)   pDevice->Release();
if (pEnum)     pEnum->Release();
CoUninitialize();
}

Napi::Value StartCapture(const Napi::CallbackInfo& info) {
auto env = info.Env();
if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsFunction()) {
Napi::TypeError::New(env, "PID(number), callback required").ThrowAsJavaScriptException();
return env.Null();
}
DWORD pid = info[0].As().Uint32Value();
tsfn = Napi::ThreadSafeFunction::New(env, info[1].As(), "AudioCapture", 0, 1);
tsfn.BlockingCall([](Napi::Env e, Napi::Function cb) { cb.Call({ Napi::String::New(e, "Capture started") });  });
std::thread([pid]() {
CaptureAudioLoopByPID(pid, L"");
tsfn.Release(); capturing = false;
}).detach();
return env.Undefined();
}
Функция полной захвата CPP здесь: https://codefile.io/f/0iwf1cid9n

Подробнее здесь: https://stackoverflow.com/questions/796 ... g-captured
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»