iPhone ffmpeg dev использует libav для декодирования из AMR в кодек ACC - PullRequest
2 голосов
/ 13 апреля 2011

Похоже, что AMR поддержка AudioQueue исчезла с момента выхода iOS 4.3. Я не могу использовать аудиофрейм, полученный от RSTP-сервера старым способом:

audioFormat.mFormatID = kAudioFormatAMR; 
int err = AudioQueueNewOutput(&audioFormat, MyAudioQueueOutputCallback, self, NULL, kCFRunLoopCommonModes, 0, &audioQueue);

В результате я получил ошибку в последней строке.

Может быть, кто-то знает, как декодировать AMR AVPacket в необработанный буфер и кодировать его в AAC или MP3, используя LIBAV?

Я пытался использовать

avcodec_decode_audio3

Это работает, и я могу получить необработанный буфер, но когда я пытаюсь кодировать его с помощью

avcodec_encode_audio

В результате я получаю 0

Это мой метод кодирования буфера:

- (AVPacket) encodeRawFrame:(const short *) in_buffer withSize:(unsigned int) in_buf_byte_size
{
    AVPacket res;
    AVCodec *codec;
    AVCodecContext *c= NULL;
    int count, out_size, outbuf_size, frame_byte_size;
    uint8_t *outbuf;

    avcodec_init();
    avcodec_register_all();

    printf("Audio encoding\n");

    codec = avcodec_find_encoder(CODEC_ID_AAC);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        return res;
    }

    c= avcodec_alloc_context();

    c->bit_rate = 64000;
    c->sample_rate = 24000;
    c->channels = 2;

    if (avcodec_open(c, codec) < 0) 
    {
        fprintf(stderr, "could not open codec\n");
    }
    else
    {
        frame_byte_size=c->frame_size*2*2;
        count = in_buf_byte_size/frame_byte_size;

        fprintf(stderr, "Number of frames: %d\n", count);

        outbuf_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
        outbuf = (uint8_t*) malloc(outbuf_size);

        out_size = avcodec_encode_audio(c, outbuf, outbuf_size, &in_buffer[frame_byte_size*i]);
        if(out_size >= 0)
        {
            res.size = outbuf_size;
            res.data = malloc(outbuf_size);                
        }

        free(outbuf);
    }


    avcodec_close(c);
    av_free(c);
    return res;
}

После кодирования "out_size" всегда равно 0 и буфер результатов пуст.

Спасибо.

1 Ответ

0 голосов
/ 02 сентября 2011

Итак, я нашел все решения, и теперь мой медиаплеер может воспроизводить аудио и видео RTSP.Я понял, что использование декодирования из AMR в AAC не является хорошей идеей из-за использования ресурсов, и было бы лучше воспроизвести буфер RAW, который можно получить с помощью средств декодирования, которые позволяют получать буфер RAW из AMR.У меня есть хороший пример (на самом деле, я должен сделать небольшой рефакторинг :)), как проигрывать потоки RTSP, и я готов поделиться им с ppl, если они будут против предоставления электронных писем :).Кроме того, у меня есть универсальный двоичный код (armv6, armv7, i386) LIBAV, AMR_NB и AAC.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...