2016-02-04 7 views
0

У меня возникли проблемы с созданием описания для вышеуказанного формата и многие попытки, но при попытке записи получить недопустимый параметр.Пример AudioStreamBasicDescription для 16hz, 16-битный моноформат как WAV-файл

Есть ли у кого-нибудь пример того, как создать этот формат?

var audioFileOutputDescription : AudioStreamBasicDescription = AEAudioStreamBasicDescriptionNonInterleaved16BitStereo 

    audioFileOutputDescription.mFormatID = kAudioFormatLinearPCM 
    audioFileOutputDescription.mSampleRate = 16000.0 
    audioFileOutputDescription.mBitsPerChannel = 16 
    audioFileOutputDescription.mChannelsPerFrame = 1 
    audioFileOutputDescription.mFramesPerPacket = 1 
    audioFileOutputDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger | 
     kAudioFormatFlagsNativeEndian 

Спасибо.

+0

Не могли бы вы дать конкретную ошибку вы получаете и линию? Возможно, ваша ошибка может быть где-то в другом месте, кроме asbd. – jaybers

+0

Уверенная ошибка: Ошибка OSStatus -50, которая переводится как: AVAudioSessionErrorCodeBadParam – O2U

ответ

0

Я не вижу mBytesPerPacket или mBytesPerFrame в любом месте.

audioFileOutputDescription.mBytesPerFrame = 2; // 1 mono channel * 2 bytes per channel 
+0

Даже с добавлением, что формат все еще работает неправильно. И документация Apple не совсем понятна, какие параметры должны быть. – O2U

1

Вы объявляете AEAudioStreamBasicDescriptionNonInterleaved16BitStereo, которое в течение 2 каналов, а затем установить mChannelsPerFrame = 1, который на 1 канале. Этот конфликт в числе каналов может быть проблемой.

Если это не проблема, один из способов его отладки - начать с рабочего asbd (из одного из примеров приложений или руководств Apple), а затем изменить одну вещь за раз, чтобы найти неподдерживаемый параметр или комбинацию параметров ,

Кроме того, файлы WAV мало ориентированы.

+0

Это тоже не работает. И устройства IIRC ARM по умолчанию имеют маленький конец, поэтому флаг kAudioFormatFlagsNativeEndian должен быть действительным для wav-файлов. – O2U

+0

См. Дополнения к моему ответу. Начните с более распространенного 44.1 стерео asbd, чтобы найти неподдерживаемый параметр. – hotpaw2

0

Возможно, вам потребуется добавить конвертирующий аудиоузел, поскольку я считаю, что аудиоустройства не поддерживают все варианты возможных вариаций в ASBD.

вход -> преобразователь AU -> сделать свой волшебный АС -> ConvertBack AU -> выход

Я думаю, что одна из самых больших трудностей, с аудиоблоку является ASBD, каждый тип аудио устройство поддерживает только несколько форматов, и, как предлагает @ hotpaw2, изменение одного параметра и тестирование иногда являются единственным способом дойти до сути проблемы. Я также считаю, что разделение аудиоустройств на небольшие отдельные аудиоустройства для выполнения одной задачи хорошо работает, поскольку они становятся легкими и пригодными для использования в будущем.

0

отлично работает для меня:

fmt.mFormatID   = kAudioFormatLinearPCM; // 2 
fmt.mSampleRate  = 8000.0;    // 3 
fmt.mChannelsPerFrame = 1;      // 4 
fmt.mBitsPerChannel = 16;     // 5 
fmt.mChannelsPerFrame = 1; 
fmt.mFramesPerPacket = 1; 
fmt.mBytesPerFrame = 2; 
fmt.mBytesPerPacket = 2; 
// 7 

fmt.mFormatFlags =        // 9 
kLinearPCMFormatFlagIsBigEndian 
| kLinearPCMFormatFlagIsSignedInteger 
| kLinearPCMFormatFlagIsPacked; 
+0

этот формат воспроизводит звук, но голос не очищается. –