Frage

Ich mag die Dauer einer Audiodatei vom Typ „amr“ zu finden, ohne sie in anderen Audioformaten zu konvertieren mit irgendeiner Weise?

AK

War es hilfreich?

Lösung

Ich habe folgendes in Objective-C codiert, um die Dauer eines Films zu erhalten. Dies kann in ähnlicher Weise verwendet werden, um die Dauer des Audio zu bekommen auch:

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

Ändern Sie den CODEC_TYPE_VIDEO zu CODEC_TYPE_AUDIO und ich denke, es sollte für Sie arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top