Как установить свойства AudioStreamBasicDescription?

Я пытаюсь воспроизвести потоковые данные PCM с сервера, используя AudioQueue.

Формат данных PCM:

Sample rate = 48000, num of channel = 2, Bit per sample = 16

И сервер не передает потоковые фиксированные байты клиенту. (переменные байты.) (например: 30848, 128, 2764, ... байтов)

Как установить ASBD? Я не знаю как настроить mFramesPerPacket, mBytesPerFrame, mBytesPerPacket, Я прочитал справочный документ Apple, но там нет подробных описаний.

Пожалуйста, дайте мне любую идею.

Новое добавлено: здесь, ASBD структура, что я установил. (язык: Swift)

// Create ASBD structure & set properties.
var streamFormat = AudioStreamBasicDescription()

streamFormat.mSampleRate = 48000
streamFormat.mFormatID = kAudioFormatLinearPCM
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked
streamFormat.mFramesPerPacket = 1
streamFormat.mChannelsPerFrame = 2
streamFormat.mBitsPerChannel = 16

streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel / 8) * streamFormat.mChannelsPerFrame
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame
streamFormat.mReserved = 0

// Create AudioQueue for playing PCM streaming data.
var err = AudioQueueNewOutput(&streamFormat, self.queueCallbackProc, nil, nil, nil, 0, &aq)

...

Я установил структуру ASBD, как указано выше.

AudioQueue очень хорошо воспроизводит потоковые данные PCM в течение нескольких секунд,

но скоро игра остановится. Что я могу сделать?

(все еще потоковая передача и постановка в очередь AudioQueue)

Пожалуйста, дайте мне любую идею.

1 ответ

ASBD - это просто структура, определяемая следующим образом:

struct AudioStreamBasicDescription
{
    Float64             mSampleRate;
    AudioFormatID       mFormatID;
    AudioFormatFlags    mFormatFlags;
    UInt32              mBytesPerPacket;
    UInt32              mFramesPerPacket;
    UInt32              mBytesPerFrame;
    UInt32              mChannelsPerFrame;
    UInt32              mBitsPerChannel;
    UInt32              mReserved;
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

Вы можете установить переменные структуры следующим образом:

AudioStreamBasicDescription streamFormat;

streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;

streamFormat.mSampleRate = sampleRate;
streamFormat.mBitsPerChannel = bitsPerChannel;
streamFormat.mChannelsPerFrame = channelsPerFrame;
streamFormat.mFramesPerPacket = 1;

int bytes = (bitsPerChannel / 8) * channelsPerFrame;
streamFormat.mBytesPerFrame = bytes;
streamFormat.mBytesPerPacket = bytes;
Другие вопросы по тегам