【问题标题】:Duration of an amr audio fileamr 音频文件的持续时间
【发布时间】:2010-09-20 20:28:35
【问题描述】:

我想查找“amr”类型的音频文件的持续时间而不将其转换为其他音频格式 有什么办法吗?

AK

【问题讨论】:

    标签: linux ffmpeg amr


    【解决方案1】:

    我在 Objective-C 中编写了以下代码来获取电影的持续时间。这也可以类似地用于获取音频的持续时间:

    -(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;
    }
    

    CODEC_TYPE_VIDEO 更改为CODEC_TYPE_AUDIO,我认为它应该适合你。

    【讨论】:

    • 上面的代码也可以很容易地转换成java。该代码非常适合视频,我已经测试过了。只要让我知道它是否也兼容音频文件。唯一不同的是您选择的流。
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2010-11-17
    • 2020-06-02
    相关资源
    最近更新 更多