AVURLAsset将持续时间返回为0

问题描述 投票:10回答:6

我试图获取音频文件的持续时间来修剪它们,我使用下面的代码,

audioAsset = [AVURLAsset assetWithURL:itemURL];

CMTime assetTime = [audioAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);

当我提供媒体库的任何音频文件的itemURL时,我得到适当的持续时间,然后我能够修剪音频文件。然后我将修剪过的音频文件保存在文档目录中。但是当我尝试修剪已经修剪过的文件时,相同的代码会将0作为持续时间返回0。但是我可以播放修剪过的文件并使用AVAudioPlayer获取持续时间,但AVURLAsset的问题是什么我无法弄清楚。

有人可以帮忙吗?我已经在stackoverflow中尝试了几乎所有问题的答案。

ios audio duration avurlasset
6个回答
16
投票

可能你已经习惯了

  NSURL *itemPathURL = [NSURL URLWithString:outPath];

代替

NSURL *itemPathURL = [NSURL fileURLWithPath:outPath];

1
投票

适用于Swift 3.0及以上版本

导入AVFoundation

  let asset = AVAsset(url: URL(fileURLWithPath: ("Your File Path here")!))
  let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
  let minutes = totalSeconds / 60
  let seconds = totalSeconds % 60
  let mediaDuration = String(format:"%02i:%02i",minutes, seconds)

0
投票

尝试以下......

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask,   YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getAudioPath = [documentsDirectory stringByAppendingPathComponent:@"song.mp3"];
NSURL *finalUrl=[[NSURL alloc]initFileURLWithPath:getAudioPath];
NSLog(@"finalUrl===%@",finalUrl);
AVURLAsset *asset = [AVURLAsset assetWithURL: finalUrl];
duration = CMTimeGetSeconds(asset.duration);
NSLog(@"duration==%f",duration);

0
投票

我认为AVURLAsset需要知道文件的类型扩展名来计算其持续时间。您可能将文件存储为{fileName}而不是{fileName}.{extension}

如果你使用没有扩展名的yourFileName运行以下代码,你将获得*** Could not find format reader for URL,并返回值0。

import AVFoundation

let fileName = *yourFileName*
let url = NSURL(fileURLWithPath: fileName)
let asset = AVURLAsset(URL: url, options: nil)
println(asset.duration.value.description)

0
投票

对于我的情况,必须识别文件名的扩展名,如“.mp3”。如果没有,它将返回0。

... let asset = AVURLAsset(url:URL(fileURLWithPath:filefullname),options:nil)... asset.duration ...


-2
投票

试试这个....

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:Yoururl options:nil];
CMTime time = asset.duration;
double durationInSeconds = CMTimeGetSeconds(time);
int minutes = floor(durationInSeconds/60);
int seconds = round(durationInSeconds - (minutes * 60));
NSString * duration = [NSString stringWithFormat:@"%i:%i",minutes,seconds];
NSLog(@"Duration : %@", duration);
© www.soinside.com 2019 - 2024. All rights reserved.