developer tip

C ++ 애드온의 'MediaStream'개체에서 오디오 데이터를 읽는 방법

optionbox 2020. 11. 22. 19:22
반응형

C ++ 애드온의 'MediaStream'개체에서 오디오 데이터를 읽는 방법


피와 눈물을 흘린 후 마침내 Node C ++ 애드온을 설정하고 웹 플랫폼 표준 MediaStream객체를 C ++ 메서드 중 하나로 밀어 넣었습니다. 다른 V8 및 Node.js 버전 간의 호환성을 위해 Node.js (nan)에 대한 기본 추상화를 사용하고 있습니다 .

addon.cc

NAN_METHOD(SetStream)
{
    Nan::HandleScope scope;
    v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}

addon.js

setStream(new MediaStream());

그만한 가치가 있기 때문에 이것은 올바르게 작동하며 (즉, 렌더러 프로세스를 제거하지 않음) MediaStream, 예를 들어 C ++ 메서드에서 생성자 이름을 반환 하여 객체 의 존재를 확인할 수 있습니다 .

addon.cc

info.GetReturnValue().Set(mediaStream->GetConstructorName());

JavaScript에서를 통해 호출되면 setStream문자열이 반환 MediaStream되므로 객체가 확실히 있습니다. 또한 mediaStream객체 자체를 반환 할 수 있으며 모든 것이 올바르게 작동하므로 실제로 필요한 객체입니다.

그렇다면 MediaStreamC ++ 에서이 객체의 오디오 데이터 (예 : 오디오 샘플)를 어떻게 읽을 수 있습니까? 참고로 실제 데이터 읽기 (및 처리)는 별도의 std::thread.


바운티 업데이트

Electron 및 / 또는 Chromium을 직접 컴파일하는 경우 이것이 좀 더 쉽고 / 가능하다는 것을 이해하지만, 유지 관리 지옥에 참여하지 않는 것이 좋습니다.

그렇게하지 않아도 가능할지 궁금해서 연구가 진행되는 한이 작업을 수행하려면 두 가지가 필요하다고 확신합니다.

  1. 블링크 공개 가 적절 하다고 생각하는 관련 헤더 파일
  2. node.dylib 파일과 유사하게 외부 기호를 해석하기위한 크롬 / 깜박임 라이브러리 파일 (?)

또한 내가 말했듯이 크롬 / 블링크를 직접 컴파일 할 수 있다고 믿고 나면이 lib 파일을 갖게 될 것이지만 Electron에서는 유지 관리가 지옥이 될 것입니다. 이를 염두에두고이 질문은 궁극적으로 C ++ 연결 질문으로 귀결된다고 생각합니다. 내가 찾고있는 것을 할 수있는 다른 접근 방법이 있습니까?

편집하다

ScriptProcessorNode는 성능으로 인해 프로덕션에서 거의 사용할 수 없기 때문에 제 경우에는 옵션이 아닙니다. 이를 위해서는 ui / main 스레드에서 오디오 샘플을 처리해야하는데, 이는 정말 미친 짓입니다.


MediaStream 헤더는 Blink의 렌더러 모듈 의 일부이며 nan 플러그인에서이를 검색 할 수있는 방법이 명확하지 않습니다.

그래서, 대신 당신은 무엇에서의 살펴 보자 않는 이, 즉 V8 :: 개체 . v8 :: Object가 필요한 모든 기능을 제공한다고 생각합니다.

  • GetPropertyNames ()
  • Get (컨텍스트, 인덱스)
  • 설정 (컨텍스트, 키, 값)
  • Has (컨텍스트, 키)

엄격하게 정의 된 인터페이스가 정말로 필요 하지 않다면 문제를 완전히 피하고 이미 가지고있는 동적 유형을 사용하는 것은 어떻습니까?

구체적으로 오디오 데이터를 가져 오려면 v8 :: Object에서 getAudioTracks () 를 호출해야합니다. 아마도 다음과 같이 보일 것입니다.

참고 : 컨텍스트가 필요하지 않다고 생각합니다. v8 은 비어있는 것에 만족하는 것 같습니다 : v8 / src / api / api.cc

다음과 같이 보일 것입니다. 그리고 v8 안팎에서 몇 가지 유형의 마사지를 받아야합니다.


v8::MaybeLocal<v8::Value> get_audio_tracks = mediaStream->Get("getAudioTracks");
// Maybe needs to be v8::Object or array?
if (!get_audio_tracks.IsEmpty()) {
    v8::Local<v8::Value> audio_tracks = get_audio_tracks.ToLocalChecked()();
}

참고 URL : https://stackoverflow.com/questions/48994486/how-to-read-audio-data-from-a-mediastream-object-in-ac-addon

반응형