2012-05-23 3 views
2

나는 2 개의 파일이 있습니다. 일단 mp3가 pcm으로 디코드되어 스트림으로 보내지는데 wav가 pcm로 읽혀집니다. 샘플은 짧은 데이터 형식으로 보관됩니다.오디오 Android/Java에 묵음 추가하기

오디오 통계 : 44,100 샘플 * 샘플 * 2 개 채널 당 16 비트 = 1,411,200 비트/초

나는 내가있는 mp3 PCM 데이터의 시작 부분에 적용해야 침묵의 X 초를 가지고 내가 그 일을하고있다 이렇게 :

private short[] mp3Buffer = null; 
private short[] wavBuffer = null; 
private short[] mixedBuffer = null; 

double silenceSamples = (audioInfo.rate * padding) * 2; 
for (int i = 0; i < minBufferSize; i++){ 

if (silenceSamples > 0){ 

mp3Buffer[i] = 0; //Add 0 to the buffer as silence 


mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2); 
silenceSamples = silenceSamples - 0.5; 
} 
else 
mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2); 

오디오는 항상 꺼져 있습니다. 때로는 두 번째 또는 두 번째 너무 빠르며 때로는 두 번째 또는 두 번째 너무 느립니다. 나는 audiorecord (wav)를 먼저 시작한 다음 start timer -> start mediaplayer (이미 준비 됨) -> end timer를 설정하고 "padding"변수와의 차이를 설정함에 따라 타이밍 문제를 생각하지 않습니다. 나는 또한 wav 헤더에서 44kb를 건너 뛰고있다.

도움을 주시면 감사하겠습니다.

답변

1

스트리밍 중 하나의 시작 부분에 패딩을 삽입하여 두 가지 오디오 소스를 정렬하려는 경우를 가정합니다. 여기 몇 가지 잘못된 점이 있습니다.

mp3Buffer[i] = 0; //Add 0 to the buffer as silence 

이 처음으로 침묵을 추가 단지 offest의 항목을 설정이다되지 [I]를 0으로 다음 줄로 배열 :

mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2); 

은 그런 다음이 값을 덮어.

스트림을 어떤 방식으로 정렬하려면 스트림 시작 부분에 묵음을 삽입하지 말고 스트림 중 하나에서 묵음을 삽입하기 만하면됩니다. 다른. 또한 32 비트 부동 소수점으로 혼합 한 다음 표준화하는 것이 좋습니다. 뭔가 같은 :

int silenceSamples = (audioInfo.rate * padding) * 2; 
      float[] mixedBuffer = new float[minBufferSize + silenceSamples] 
    for (int i = 0; i < minBufferSize + silenceSamples; i++){ 

    if (i < silenceSamples) 
    {  
     mixedBuffer[i] = (float) stereoWavBuffer[i]; 
    } 
    else if(i < minBufferSize) 
    { 
     mixedBuffer[i] = (float) (stereoWavBuffer[i] + mp3Buffer[i-silenceSamples]); 
    } 
    else 
    { 
     mixedBuffer[i] = (float) (mp3Buffer[i-silenceSamples]); 
    } 

당신이 32,767/largestValue 여러 다음 배열의 모든 값을 mixedBuffer를 통해 실행하고 가장 큰 절대 값 Math.abs(...)를 찾은 데 필요한 데이터를 정상화하려면이 -이 당신에게 버퍼 곳을 줄 것이다 가장 큰 값은 클리핑없이 짧게 돌아갑니다. 그런 다음 각 값을 짧은 배열로 다시 이동하는 float 배열을 반복합니다.

귀하의 minBufferSize이 무엇인지 확실하지 않습니다. 모든 데이터가 혼합 될만큼 충분히 커야합니다.

+0

stereoWavBuffer를 오프셋하는 것처럼 보입니다. 내가 여기서 맞습니까? 일단 mp3Buffer가 시작되고 나서 silenceSamples가 I보다 강하면 stereoWavBuffer가 시작될 것입니까? – nawlrus

+0

예 - 어떤 것을 오프셋하고 싶은지 잘 모르겠습니다. 그래서 방금 WavBuffer를 선택했습니다. 또한 혼합 된 데이터를 두 개로 나누기를 원하지 않을 수도 있습니다. float [32 비트 해상도를 제공합니다]의 배열에 함께 섞은 다음 float []을 16 비트 범위로 정규화 한 다음 다시 []로 변환하십시오. 내 예제를 업데이트하겠습니다 ... –

+0

죄송합니다 - 침묵은 MP3 오디오의 시작 부분에 있어야한다고 말씀하셨습니다 - 대답은 –