2012-07-31 3 views
0

IMediaSample을 사용하여 PCM 오디오 스트림에서 무음을 감지해야합니다. 신호는 TV에서 제공되며 광 케이블을 통해 PC와 Prodigy 7.1 HiFi 사운드 카드에 연결됩니다. 지금까지이있다 :PCM 오디오에서 IMediaSample으로 무음을 감지하는 방법

bool detectSound(IMediaSample *pSamples) 
{ 
    BYTE *pData; 
    pSamples->GetPointer(&pData); 
    long size = pSamples->GetActualDataLength(); 

    long nulls = 0; 
    for(long i = 0; i < size; ++i) { 
     if(pData[i] == 0) 
      ++nulls; 
    } 

    /* 0.9 to eliminate interference */ 
    long max_nulls = (long) (0.9 * size); 
    if(nulls > max_nulls) {     /* STOP */ 
     /* no audio */ 
     return false; 
    } 
    else { 
     /* audio available */ 
     return true; 
    } 
} 

문제는 내가 줄에서 중단 점을 넣어 경우 널 (null)이 거의 항상 같은 값을 가지고 있으며, 나는 TV를 음소거 아닌지에 상관없이 max_nulls보다 작은, "STOP"으로 표시된 것입니다. pData [i] 값은 항상 0 또는 255입니다. (이상하거나하지 않습니까?)

아마이 "데이터"가 무엇이며 어떻게 해석하는지 이해할 수 없습니다. 모든 샘플링 된 파형의 값보다 오디오가 없으면 거의 0이어야합니다.

내 사고 방식을 확인할 수 있습니까? 미리 감사드립니다.

일식

편집 : "SPDIF 테스트"에서 내가 44.1 kHz에서 48 kHz 및 32 kHz의가 DirectSound를 지원하지 않는 얻었 기 때문에

문제는, 드라이버와 AC3 필터 설정 주위 어딘가에입니다. 로마의 생각은 옳았고 이것을 고칠 때 잘 작동 할 것입니다.

답변

2

더 좋은 방법은 PCM 데이터가 무엇인지 알아내는 것이고 게시 된 질문에 대한 답변은 사소한 것입니다.

빠를 방법은 다음과 같습니다

  • 이 짧은 값은 바이트 그 오디오 데이터 처리 (당신이 언급하지 않았다,하지만 난 당신의 오디오가 가정 16 비트)
  • 이 채널로 분할 좋을 것이다
  • 및 계산 된 값이 소정의 작은 thresold 미만인 경우시/프로세스는 별도로
  • 계산 standard deviation
  • 침묵이다
+0

나는 당신과 동의하지만 계산 된 값은 음소거 되어도 시간에 따라 일정합니다 (2 바이트를 하나의 16 비트 샘플로 취급 함). 우선, IMediaSample에 의해 리턴 된 데이터 버퍼에는 무엇이 포함되어 있습니까? 파형에서 16 비트 샘플 값을 가져 왔습니까? 이것은 지금 당장 나를위한 기본적인 질문입니다. – eclipse

+0

버퍼에는 일반적으로 다음 데이터가 들어 있습니다. [PCM 파형 - 오디오 데이터 형식] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd797880%28v=vs.85%29.aspx#PCM_Waveform -Audio_Data_Format) –

+0

나는 당신이 말했듯이 : 나는 채널로 샘플을 나누었고, 채널 샘플 당 2 바이트를 저장하기 위해 signed short를 사용했지만, 실제 침묵의 값은 소리가있는 값과 크게 다르지 않다. (소리는 꽤 크다. TV 규모의 중단에 대해). 값의 범위는 -80 ~ +80입니다. 그리고 당신이 저에게 준 사이트의 정보를 사용했습니다. – eclipse