2013-08-16 4 views
0

Я пишу плагин Unity3D, который считывает данные из файла MP3, передает данные PCM в Unity, чтобы он мог воспроизводить его внутри движка. В iOS я использую класс AVAssetReaderAudioMixOutput для декодирования и чтения данных, а на Android/Windows я использую FMOD. Я установил программу как для Windows, так и для iOS, которая использует FMOD для воспроизведения музыки, как это делает Unity3D. У меня возникают проблемы с получением одинаковых результатов как на iOS, так и на окнах, и я не могу найти разницу в настройках/формате аудиовыхода, которые могут вызвать разницу.Формат данных PCM с fmod - разность на нескольких paltforms

Так первый, это параметры, которые я установил для моего вывода звукового потока, которые одни и те же настройки, как использует Unity3D:

FMOD_CREATESOUNDEXINFO exinfo2; 
memset(&exinfo2, 0, sizeof(FMOD_CREATESOUNDEXINFO)); 
exinfo2.cbsize   = sizeof(FMOD_CREATESOUNDEXINFO);    
exinfo2.decodebuffersize = 44100;         
exinfo2.length   = 44100 * 1 * sizeof(float) * 100;    
exinfo2.numchannels  = 1;           
exinfo2.defaultfrequency = 44100;         
exinfo2.format   = FMOD_SOUND_FORMAT_PCMFLOAT;   
exinfo2.pcmreadcallback = pcmreadcallback;       
result = system_->createStream("./1.mp3", FMOD_LOOP_NORMAL | FMOD_SOFTWARE | FMOD_OPENUSER | FMOD_CREATESTREAM, &exinfo2, &sound2_); 
ERRCHECK(result); 
result = system_->playSound(FMOD_CHANNEL_FREE,sound2_,false,0); 

В основном, 1 канал, данные PCM 32-бит с плавающей точкой. Это устанавливается как для iOS, так и для программ воспроизведения Windows. Теперь на прошивкой, я поставил AVAssetReaderAudioMixOutput настройки звука, как это:

NSDictionary *audioSetting = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithFloat:44100.0],AVSampleRateKey, 
            [NSNumber numberWithInt:1],AVNumberOfChannelsKey, //how many channels has original? 
            [NSNumber numberWithInt:32],AVLinearPCMBitDepthKey, //was 16 
            [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
            [NSNumber numberWithBool:YES], AVLinearPCMIsFloatKey, //was NO 
            [NSNumber numberWithBool:0], AVLinearPCMIsBigEndianKey, 
            [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, 
            [NSData data], AVChannelLayoutKey, nil]; 

Я установил PCMIsFloatKey 1, так что данные ИКМ с плавающей точкой, я поставил битовую глубину до 32, 1 канал, так что все соответствует настройкам выхода FMOD.

Я читать данные и записать его в кольцевой буфер:

 float* convertedBuffer = (float *) audioBufferList.mBuffers[0].mData; 
     //We don't need the audioconverter on iOS 
     //Fill up the circular buffer 
     for(int i = 0; i < numSamples; i++) 
     { 
      circularAudioBuffer_[bufferWritePosition_] = convertedBuffer[i]; 
      bufferWritePosition_++; 
      if(bufferWritePosition_ >= circularBufferSize_) 
       bufferWritePosition_ = 0; 

     } 

затем прочитать данные из буфера и записать его в звуковой поток в pcmreadcallback:

float *writeBuffer = (float *)data; 
for(int i = 0; i < dataLength; i++) 
{ 
    sampleBuffer[i] = circularAudioBuffer_[bufferReadPosition_]; 
    bufferReadPosition_++; 
    if(bufferReadPosition_ >= circularBufferSize_) 
     bufferReadPosition_ = 0; 
} 

С этим , звук воспроизводится отлично, а диапазон значений внутри кругового буфера равен 0.0-1.0f

Теперь, в окнах, я инициализирую звук, из которого я прочитал следующие данные:

exinfo.cbsize   = sizeof(FMOD_CREATESOUNDEXINFO);    
exinfo.decodebuffersize = 44100; 
exinfo.numchannels  = 1; 
exinfo.defaultfrequency = 44100;    
exinfo.format   = FMOD_SOUND_FORMAT_PCMFLOAT; 

Установка тех же параметров: 1 канал, 32-разрядная плавающая точка. Я прочитал данные и записывать данные в буфер:

FMOD_RESULT result = sound_->readData(rawBuffer, N4, &bytesRead); 

    float* floatBuffer = (float*) rawBuffer; 
    for(int j = 0; j < N; j++) 
    { 
     circularAudioBuffer_[bufferWritePosition_++] = floatBuffer[j]; 
     if(bufferWritePosition_ >= circularBufferSize_) 
      bufferWritePosition_ = 0; 
    } 

Теперь, когда я читаю эти данные, я получаю очень высокие или очень низкие значения с плавающей точкой (около 1e34 ​​или -1e33). В тестовой программе я ничего не слышу на выходе.

Я могу переключить входной и выходной звуковой формат на PCM32, и он отлично воспроизводится в тестовой программе, но не может быть правильно прочитан в Unity3D (он много прокручивает, но я могу разобрать песню).

Может ли кто-нибудь помочь мне понять это и заставить его работать правильно, используя формат PCMFLOAT? благодаря!

TL; Я не могу читать данные из FMOD-звука с форматом PCMFLOAT!

ответ

0

От поддержки Fmod: Fmod Forums Указанный формат вывода не имеет значения. Кодек FMod всегда будет возвращать PCM16, а кодек iOS возвращает PCMFloats. Таким образом, мне нужно, чтобы преобразовать их:

(float)pcm16in[j]/32768.0f; 

В дополнение к этому, я был (случайно) инициализацией выходной поток с MP3-файл, который сделал это так, чтобы я не мог изменить формат вывода.

 Смежные вопросы

  • Нет связанных вопросов^_^