Search code examples
linuxffmpegamr

Duration of an amr audio file


i want to find the duration of an audio file of type "amr" without converting it to other audio formats with any way?

AK


Solution

  • I have coded the following in objective-C to get the duration of a movie. This can similarly be used to get the duration of audio too:

    -(double)durationOfMovieAtPath:(NSString*)inMoviePath
    {
        double durationToReturn = -1;
    
        NSFileManager *fm = [NSFileManager defaultManager];
        if ([fm fileExistsAtPath:inMoviePath])
        {
            av_register_all();
    
            AVFormatContext *inMovieFormat = NULL;
            inMovieFormat = avformat_alloc_context();
            int errorCode = av_open_input_file(&inMovieFormat, [inMoviePath UTF8String], NULL, 0, NULL);
            //double durationToReturn = (double)inMovieFormat->duration / AV_TIME_BASE;
    
            if (0==errorCode)
            {
                // only on success
                int numberOfStreams = inMovieFormat->nb_streams;
                AVStream *videoStream = NULL;
                for (int i=0; i<numberOfStreams; i++)
                {
                    AVStream *st = inMovieFormat->streams[i];
    
                    if (st->codec->codec_type == CODEC_TYPE_VIDEO)
                    {
                        videoStream = st;
                        break;
                    }
                }
    
                double divideFactor;
                // The duraion in AVStream is set in accordance with the time_base of AVStream, so we need to fetch back the duration using this factor
                divideFactor = (double)1/rationalToDouble(videoStream->time_base);
    
                if (NULL!=videoStream)
                    durationToReturn = (double)videoStream->duration / divideFactor;
                //DEBUGLOG (@"Duration of movie at path: %@ = %0.3f", inMoviePath, durationToReturn);
            }
            else
            {
                DEBUGLOG (@"avformat_alloc_context error code = %d", errorCode);
            }
    
            if (nil!=inMovieFormat)
            {
                av_close_input_file(inMovieFormat);
                //av_free(inMovieFormat);
            }
        }
    
        return durationToReturn;
    }
    

    Change the CODEC_TYPE_VIDEO to CODEC_TYPE_AUDIO and I think it should work for you.