int main (int argc, char **argv) { uint_t err = 0; if (argc < 2) { err = 2; PRINT_ERR("not enough arguments\n"); PRINT_MSG("read a wave file as a mono vector\n"); PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]); PRINT_MSG("examples:\n"); PRINT_MSG(" - read file.wav at original samplerate\n"); PRINT_MSG(" %s file.wav\n", argv[0]); PRINT_MSG(" - read file.wav at 32000Hz\n"); PRINT_MSG(" %s file.aif 32000\n", argv[0]); PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n"); PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]); return err; } #ifdef HAVE_AVCODEC uint_t samplerate = 0; uint_t hop_size = 256; uint_t n_frames = 0, read = 0; if ( argc == 3 ) samplerate = atoi(argv[2]); if ( argc == 4 ) hop_size = atoi(argv[3]); char_t *source_path = argv[1]; aubio_source_avcodec_t * s = new_aubio_source_avcodec(source_path, samplerate, hop_size); if (!s) { err = 1; goto beach; } fvec_t *vec = new_fvec(hop_size); if (samplerate == 0 ) samplerate = aubio_source_avcodec_get_samplerate(s); do { aubio_source_avcodec_do(s, vec, &read); fvec_print (vec); n_frames += read; } while ( read == hop_size ); PRINT_MSG("read %d frames at %dHz (%d blocks) from %s\n", n_frames, samplerate, n_frames / hop_size, source_path); del_fvec (vec); del_aubio_source_avcodec (s); beach: #else err = 3; PRINT_ERR("aubio was not compiled with aubio_source_avcodec\n"); #endif /* HAVE_AVCODEC */ return err; }
aubio_source_avcodec_t * new_aubio_source_avcodec(char_t * path, uint_t samplerate, uint_t hop_size) { aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t); int err; if (path == NULL) { AUBIO_ERR("source_avcodec: Aborted opening null path\n"); goto beach; } if ((sint_t)samplerate < 0) { AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", path, samplerate); goto beach; } if ((sint_t)hop_size <= 0) { AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", path, hop_size); goto beach; } s->hop_size = hop_size; s->channels = 1; s->path = path; // register all formats and codecs av_register_all(); // if path[0] != '/' //avformat_network_init(); // try opening the file and get some info about it AVFormatContext *avFormatCtx = s->avFormatCtx; avFormatCtx = NULL; if ( (err = avformat_open_input(&avFormatCtx, s->path, NULL, NULL) ) < 0 ) { char errorstr[256]; av_strerror (err, errorstr, sizeof(errorstr)); AUBIO_ERR("source_avcodec: Failed opening %s (%s)\n", s->path, errorstr); goto beach; } // try to make sure max_analyze_duration is big enough for most songs avFormatCtx->max_analyze_duration *= 100; // retrieve stream information if ( (err = avformat_find_stream_info(avFormatCtx, NULL)) < 0 ) { char errorstr[256]; av_strerror (err, errorstr, sizeof(errorstr)); AUBIO_ERR("source_avcodec: Could not find stream information " "for %s (%s)\n", s->path, errorstr); goto beach; } // dump information about file onto standard error //av_dump_format(avFormatCtx, 0, s->path, 0); // look for the first audio stream uint_t i; sint_t selected_stream = -1; for (i = 0; i < avFormatCtx->nb_streams; i++) { if (avFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if (selected_stream == -1) { selected_stream = i; } else { AUBIO_WRN("source_avcodec: More than one audio stream in %s, " "taking the first one\n", s->path); } } } if (selected_stream == -1) { AUBIO_ERR("source_avcodec: No audio stream in %s\n", s->path); goto beach; } //AUBIO_DBG("Taking stream %d in file %s\n", selected_stream, s->path); s->selected_stream = selected_stream; AVCodecContext *avCodecCtx = s->avCodecCtx; avCodecCtx = avFormatCtx->streams[selected_stream]->codec; AVCodec *codec = avcodec_find_decoder(avCodecCtx->codec_id); if (codec == NULL) { AUBIO_ERR("source_avcodec: Could not find decoder for %s", s->path); goto beach; } if ( ( err = avcodec_open2(avCodecCtx, codec, NULL) ) < 0) { char errorstr[256]; av_strerror (err, errorstr, sizeof(errorstr)); AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, errorstr); goto beach; } /* get input specs */ s->input_samplerate = avCodecCtx->sample_rate; s->input_channels = avCodecCtx->channels; //AUBIO_DBG("input_samplerate: %d\n", s->input_samplerate); //AUBIO_DBG("input_channels: %d\n", s->input_channels); if (samplerate == 0) { samplerate = s->input_samplerate; //AUBIO_DBG("sampling rate set to 0, automagically adjusting to %d\n", samplerate); } s->samplerate = samplerate; if (s->samplerate > s->input_samplerate) { AUBIO_WRN("source_avcodec: upsampling %s from %d to %d\n", s->path, s->input_samplerate, s->samplerate); } AVFrame *avFrame = s->avFrame; avFrame = av_frame_alloc(); if (!avFrame) { AUBIO_ERR("source_avcodec: Could not allocate frame for (%s)\n", s->path); } /* allocate output for avr */ s->output = (float *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE * sizeof(float)); s->read_samples = 0; s->read_index = 0; s->avFormatCtx = avFormatCtx; s->avCodecCtx = avCodecCtx; s->avFrame = avFrame; // default to mono output aubio_source_avcodec_reset_resampler(s, 0); s->eof = 0; s->multi = 0; //av_log_set_level(AV_LOG_QUIET); return s; beach: //AUBIO_ERR("can not read %s at samplerate %dHz with a hop_size of %d\n", // s->path, s->samplerate, s->hop_size); del_aubio_source_avcodec(s); return NULL; }