[Libav-user] AAC encoding question

Luke Clemens lclemens at gmail.com
Mon Jul 18 20:17:04 CEST 2011


I don' t know if this is your problem or not, but I think you can
replace all malloc() and free() functions with av_malloc() and
av_free(). My understanding is that the av versions ensure that the
memory is aligned properly so you don't need to use posix_memalign().

On Sun, Jul 17, 2011 at 4:53 PM, alex b. <abalk at avail-tvn.com> wrote:
>
>
> Hi,
>
> I am trying to encode audio using the AAC audio encoder with the program
> below. It seems to work fine (runs without issues) but the resulting AAC
> audio is not playable with anything like ffplay or mplayer. If anyone can
> point out what I'm doing wrong that would be really appreciated.
>
> The input.wav file is made up of 2 channel 6144 byte samples, 5 to each
> frame (for a frame size of 30720 byes) and it plays fine in mplayer with a
> command like
>
> $ mplayer -demuxer rawaudio -rawaudio rate=48000 input.wav
>
> there is no header in the .wav file, but that's ok. also, encoding this
> input using ffmpeg and the "-strict experimental" option for AAC audio works
> fine as well
>
>
> thanks, alez...
>
>
> -----------------------------------------------------------
>
> /* test audio encoder */
> #define _XOPEN_SOURCE 600
>
> #include <stdint.h>
> #include <stdlib.h>
> #include <string.h>
> #include <inttypes.h>
> #include <stdio.h>
> #include <avcodec.h>
> #include <libavcodec/opt.h>
> #include <libavutil/log.h>
>
> #define FRM_SZ  30720
> #define SMPL_SZ 6144
>
> int main(void)
> {
>    AVCodec *codec;
>    AVCodecContext *context;
>    int bytes_read;
>    FILE* in_pcm = fopen("input.wav", "rb");
>    FILE* out_aac = fopen("output.aac", "wb");
>
>    uint8_t* inbuff = malloc(FRM_SZ*sizeof(uint8_t));
>    uint8_t* smallbuff;
>
>    avcodec_init();
>    avcodec_register_all();
>
>    codec = avcodec_find_encoder(CODEC_ID_AAC);
>
>    context = avcodec_alloc_context3(codec);
>
>    context->bit_rate = 128000;
>    context->sample_rate = 48000;
>    context->channels = 2;
>    context->frame_size = 30720;
>    context->sample_fmt = AV_SAMPLE_FMT_S16;
>
>    if (avcodec_open2(context, codec, NULL) < 0)
>    {
>        fprintf(stderr, "ERROR: could not initialize encoder\n");
>        exit(1);
>    }
>
>    while ( ( bytes_read = fread( inbuff, FRM_SZ, 1, in_pcm ) ) > 0 )
>    {
>        // there are 5 audio samples per frame (4620 frames total = 28385280
> bytes in the file)
>        for ( int i = 0; i < 5; i++ )
>        {
>            smallbuff = malloc(SMPL_SZ*sizeof(uint8_t));
>
>            memcpy(smallbuff, &inbuff[i*SMPL_SZ], SMPL_SZ);
>
>            int frame_bytes = context->frame_size * context->sample_fmt *
> context->channels;
>            int outbuf_size;
>
>            uint8_t* outbuf;
>            posix_memalign( (void**)&outbuf, (size_t)16, (size_t)frame_bytes
> );
>
>            outbuf_size = avcodec_encode_audio(context, outbuf, frame_bytes,
> (short*)smallbuff);
>
>            fwrite(outbuf, outbuf_size, 1, out_aac);
>
>            free(outbuf);
>            free(smallbuff);
>        }
>    }
>
>    free(inbuff);
>    return 0;
> }
>
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>



-- 
-
-
-
-
Luke Clemens
http://clemens.bytehammer.com


More information about the Libav-user mailing list