зачем возвращать отрицательные значения - PullRequest
0 голосов
/ 06 марта 2012

Я хочу отобразить список аудиофайлов в каталоге и их продолжительность, чтобы получить длительность, которую я использую:

AVAudioPlayer * sound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];

NSLog([NSString stringWithFormat:@"%f", sound.duration]);

cell.detailTextLabel.text =[NSString stringWithFormat:@"Duration: %.2f sec", sound.duration];

Но иногда sound.duration возвращает отрицательное значение. Я хотел бы знать, почему и как это решить.

С наилучшими пожеланиями

Ответы [ 2 ]

2 голосов
/ 06 марта 2012
AudioFileID                     audioFile;
CFDictionaryRef piDict = nil;
UInt32 piDataSize   = sizeof( piDict );

if (noErr != AudioFileOpenURL((CFURLRef)[NSURL fileURLWithPath:filePath], 0x01, kAudioFileCAFType, &audioFile))
{
    return [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithString:filePath], @"FilePath", @"Unknown",@"Title",@"Unknown",@"Album",@"Unknown",@"Artist",@"0", @"Duration", nil];
}
if( noErr != AudioFileGetProperty( audioFile, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict ))
{
    AudioFileClose(audioFile);
    return [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithString:filePath], @"FilePath", @"Unknown",@"Title",@"Unknown",@"Album",@"Unknown",@"Artist",@"0", @"Duration", nil];
}

AudioFileClose(audioFile);

if(piDict)
{
    NSString * duration = @"0";
    CFStringRef      durationString = nil;
    if ( piDict && CFDictionaryGetValueIfPresent(piDict, CFSTR(kAFInfoDictionary_ApproximateDurationInSeconds), (const void **) &durationString))
    {
        duration = (NSString*)durationString;
        duration = [duration stringByReplacingOccurrencesOfString:@"," withString:@""];
    }
    if (duration)
        [songInfomationDictionary setObject:duration forKey:@"Duration"];


    CFRelease(piDict);
    //get duration as string
}   
return nil; 
0 голосов
/ 06 марта 2012

надеюсь, что это поможет вам .. в вашем коде вы печатаете в nslog без присваивания и неправильного формата, так что это дает минус.так проверьте это один раз.

AVAudioPlayer * sound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:@"/Users/apple/Desktop/LabelTextDemo/LabelTextDemo/song2.caf"] error:nil];

NSLog(@"%@",[NSString stringWithFormat:@"%.2f", sound.duration]);
...