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 바이트를 하나의 16 비트 샘플로 취급 함). 우선, IMediaSample에 의해 리턴 된 데이터 버퍼에는 무엇이 포함되어 있습니까? 파형에서 16 비트 샘플 값을 가져 왔습니까? 이것은 지금 당장 나를위한 기본적인 질문입니다. – eclipse
버퍼에는 일반적으로 다음 데이터가 들어 있습니다. [PCM 파형 - 오디오 데이터 형식] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd797880%28v=vs.85%29.aspx#PCM_Waveform -Audio_Data_Format) –
나는 당신이 말했듯이 : 나는 채널로 샘플을 나누었고, 채널 샘플 당 2 바이트를 저장하기 위해 signed short를 사용했지만, 실제 침묵의 값은 소리가있는 값과 크게 다르지 않다. (소리는 꽤 크다. TV 규모의 중단에 대해). 값의 범위는 -80 ~ +80입니다. 그리고 당신이 저에게 준 사이트의 정보를 사용했습니다. – eclipse