аудио ffmpeg и iphone - PullRequest
       37

аудио ffmpeg и iphone

1 голос
/ 29 января 2010

кто-нибудь смог заставить ffmpeg работать с аудио-очередями, я получаю сообщение об ошибке при попытке создать очередь.

ret = avcodec_open(enc, codec);

if (ret < 0) {
    NSLog(@"Error: Could not open video decoder: %d", ret); 
    av_close_input_file(avfContext); 
    return; 
}


if (audio_index >= 0) { 
    AudioStreamBasicDescription
    audioFormat;

    audioFormat.mFormatID = -1;

    audioFormat.mSampleRate =
    avfContext->streams[audio_index]->codec->sample_rate;

    audioFormat.mFormatFlags = 0;

    switch (avfContext->streams[audio_index]->codec->codec_id)
    {
    case CODEC_ID_MP3: 
        audioFormat.mFormatID = kAudioFormatMPEGLayer3; 
        break;

    case CODEC_ID_AAC: 
        audioFormat.mFormatID = kAudioFormatMPEG4AAC;
        audioFormat.mFormatFlags = kMPEG4Object_AAC_Main;
        break;

    case CODEC_ID_AC3:
        audioFormat.mFormatID = kAudioFormatAC3; 
        break; 
    default: 
        break; 
    }

    if (audioFormat.mFormatID != -1) { 
        audioFormat.mBytesPerPacket = 0; 
        audioFormat.mFramesPerPacket =
        avfContext->streams[audio_index]->codec->frame_size;

        audioFormat.mBytesPerFrame = 0;

        audioFormat.mChannelsPerFrame = avfContext->streams[audio_index]->codec->channels;

        audioFormat.mBitsPerChannel = 0;

        if (ret = AudioQueueNewOutput(&audioFormat, audioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue)) {

            NSLog(@"Error creating audio output queue: %d", ret);
        }

Проблемы только со звуком,

Видео идеально, если только я смогу понять, как заставить работать аудио-очереди.

http://web.me.com/cannonwc/Site/Photos_6.html

Я думаю о remoteio, но документации по этому вопросу не так много.

Я поделюсь кодом для полного класса всем, кто поможет мне заставить его работать.

Идея состоит в том, чтобы иметь один контроллер представления, который воспроизводит любое передаваемое потоковое видео, аналогично ffplay на iphone, но без дополнительных затрат sdl.

1 Ответ

2 голосов
/ 29 января 2010

Возможно, вам не хватает некоторых важных спецификаций в структуре AudioStreamBasicDescription: я не знаю о ffmpeg, но указание нулевых байтов на кадр и нулевых байтов на пакет не сработает;) Вот как я заполнил бы структуру, учитывая частота дискретизации , аудиоформат , количество каналов и бит на выборку :

iAqc.mDataFormat.mSampleRate = iSampleRate;
iAqc.mDataFormat.mFormatID = kAudioFormatLinearPCM;
iAqc.mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
iAqc.mDataFormat.mBytesPerPacket = (iBitsPerSample >> 3) * iNumChannels;
iAqc.mDataFormat.mFramesPerPacket = 1;
iAqc.mDataFormat.mBytesPerFrame = (iBitsPerSample >> 3) * iNumChannels;
iAqc.mDataFormat.mChannelsPerFrame = iNumChannels;
iAqc.mDataFormat.mBitsPerChannel = iBitsPerSample;

Я предполагаю, что вы записываете сэмплы PCM на аудиоустройство. Пока вы знаете аудиоформат, с которым вы работаете, не должно быть проблем с его адаптацией: важно помнить, что все это значит. Здесь я работаю с одним образцом кадра на пакет, поэтому число байтов на пакет совпадает с количеством байтов на кадр.

Большинство проблем возникает из-за того, что многие слова неправильно используются, например, «сэмплы», «кадры сэмплов» в неправильном контексте и т. Д.: Кадр сэмплов можно рассматривать как элементарную единицу аудиоданных который охватывает все доступные каналы, выборка относится к единому подразделу данных, составляющему кадр выборки.

Например, у вас есть аудиопоток из 2 каналов с разрешением 16 бит на семпл: семпл будет иметь размер 2 байта (16 бит / с / 8 или 16 >> 3), кадр семпла также будет принимать число каналы, поэтому он будет иметь размер 4 байта (2 байта x 2 канала).

ВАЖНО Теория, лежащая в основе этого, применима не только к iPhone, но и к кодированию звука в целом! Просто случается, что AudioQueues запрашивает у вас четко определенные спецификации вашего аудиопотока, и это хорошо, но вместо этого вас могут попросить указать байты, поэтому выражение размеров аудиоданных в виде аудиокадров всегда хорошо, вы всегда можете преобразовать размеры данных и будь уверен в этом.

...