Is the audio stream in stereo? I'm not 100% sure, but suspect your
buffer might need to be twice as big. Number of sample X number of
channels X bytes per sample. If 16 bit audio then you also have 2
bytes per sample, so maybe 4 times as large. Oops, I see you are
using a short so just twice the size, but don't forget the number of
channels.
Just make a really big buffer and check the output buffer size after
decode.
Sent from my iPod
On Jul 21, 2010, at 7:46 AM, Emyr James <[email protected]> wrote:
I pulled apart the api_example.c and looked at a few of the threads
in the archives and came up with the program below to try to decode
some audio to raw samples. The dump_format seems to give the right
stuff and I manage to decode the first set of samples from the file
but after that everything fails. I guess there must be something
small in the program that I'm missing as it *almost* seems to work
now. Why am I getting "buffer smaller than
AVCODEC_MAX_AUDIO_FRAME_SIZE" when as far as I can tell I've made
the input buffer (using av_new_packet) and the output buffer at
least this size ?
Can anyone help me get over the final hurdle ?
/**
* to build : gcc -o decode decode.c -lavcodec -lavdevice -lavformat -
lavutil -lz -lvorbis -lvorbisenc -lvorbisfile -lmp3lame -lbz2
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libavcodec/avcodec.h>
#include <libavutil/mathematics.h>
#include <libavformat/avformat.h>
int main(int argc, char **argv)
{
// declare variables
int i;
AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx;
int audioStream;
AVCodec *codec;
short *outbuf;
int num_samples;
int out_size;
FILE *outfile;
int frame_count;
AVPacket avpkt;
int len;
if (argc !=3) {
printf("Decode audio from a media file to raw samples.
\nUsage : decode <input filename> <output filename>\n");
return 1;
}
// initialise libavformat /libavcodec
avcodec_init();
avcodec_register_all();
av_register_all();
// data structures
// open input file
av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL);
// get streams info
av_find_stream_info(pFormatCtx);
// dump the format
dump_format(pFormatCtx, 0, argv[1], 0);
// get first audio stream , pCodecCtx will point to it
audioStream=-1;
for(i=0; i<pFormatCtx->nb_streams; i++) {
pCodecCtx=pFormatCtx->streams[i]->codec;
if(pCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
audioStream=i;
break;
}
}
if(audioStream==-1) {
printf("No audio stream found\n");
exit(1);
}
// try to find it's codec and open it
codec=avcodec_find_decoder(pCodecCtx->codec_id);
if(codec==NULL) {
printf("can't find codec\n");
exit(1);
}
if (avcodec_open(pCodecCtx,codec) != 0) {
printf("can't open codec\n");
exit(1);
}
// output samples buffers
num_samples=AVCODEC_MAX_AUDIO_FRAME_SIZE;
out_size=sizeof(short)*num_samples;
outbuf = (short*) malloc(num_samples);
// open the output file to write sample data into it
outfile = fopen(argv[2], "wb");
if (!outfile) {
exit(1);
}
// initialise the packet
av_new_packet(&avpkt,AVCODEC_MAX_AUDIO_FRAME_SIZE
+FF_INPUT_BUFFER_PADDING_SIZE);
// do the decoding
frame_count=0;
while(av_read_frame(pFormatCtx, &avpkt)>=0) {
++frame_count;
while (avpkt.size>0) {
len = avcodec_decode_audio3(pCodecCtx, outbuf, &out_size,
&avpkt);
if(len < 0) {
printf("failed to decode frame %d\n", frame_count);
break;
} else {
printf("decoded %d samples for frame %d\n", len,
frame_count);
}
avpkt.data += len;
avpkt.size -= len;
fwrite(outbuf, 1, out_size, outfile);
}
}
fclose(outfile);
free(outbuf);
avcodec_close(pCodecCtx);
return 0;
}
output...
[mp3 @ 0x101008000]max_analyze_duration reached
[mp3 @ 0x101008000]Estimating duration from bitrate, this may be
inaccurate
Input #0, mp3, from 'music.mp3':
Metadata:
TCON : FILM STYLES,DRAMA$FILM STYLES,FANTASY /
ADVENTURE$DRAMA,ADVENTURE$TRAILER MUSIC,ACTION/ADVENTURE$DRAMA,CHASE
$DRAMA,ACTION$FILM STYLES,SCIENCE FICTION$FILM STYLES,ACTION
TIT3 : Punchy, dramatic electronic action - Need for
Speed Most Wanted
TOPE : Linford, Paul(BMI)<MPM ARTS MUSIC>
TCOM : Linford, Paul(BMI)<MPM ARTS MUSIC>
TALB : NEED FOR SPEED - MOST WANTED - MUSIC FROM THE
EA GAME
TLEN : 183000
TPUB : BMI
TPE1 : EA
TIT2 : Get Out of Trouble
TOAL : EA_0010_005.01
TSSE : LAME 3.96.1 - Metadata by Soundminer Inc.
www.soundminer.com
TPE4 : <MAGIC><Encoder>Metadata enbedded by
Soundminer.</Encoder><kAudioFilePropertyDataFormat>2 ch, 48000 Hz,
'lpcm' (0x0000000C)16-bit </
kAudioFilePropertyDataFormat><Channels type="NSNumber">2</
Channels><BWDate>2007-03-28</BWDate><Category>FILM STYLES,DRAMA$FILM
STYLES,FANTASY / ADVENTURE$DRAMA,ADVENTURE$TRAILER MUSIC,ACTION/
ADVENTURE$DRAMA,CHASE$DRAMA,ACTION$FILM STYLES,SCIENCE FICTION$FILM
STYLES,ACTION</Category><BWCodingHistory>Metadata added by
Soundminer.</BWCodingHistory><TrackTitle>Ge
Duration: 00:03:06.93, start: 0.000000, bitrate: 320 kb/s
Stream #0.0: Audio: mp3, 44100 Hz, 2 channels, s16, 320 kb/s
[mp3 @ 0x101009200]buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE
decoded 1044 samples for frame 1
failed to decode frame 2
failed to decode frame 3
failed to decode frame 4
failed to decode frame 5
failed to decode frame 6
failed to decode frame 7
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user