我正在尝试获取音频文件的持续时间以便修剪它们,我使用下面的代码,
audioAsset = [AVURLAsset assetWithURL:itemURL];
CMTime assetTime = [audioAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);
当我提供媒体库的任何音频文件的itemURL时,我得到了适当的持续时间,然后我可以修剪音频文件。然后我将修剪过的音频文件保存在文档目录中。但是当我尝试修剪已经修剪过的文件时,相同的代码会将0作为持续时间返回0。但是我可以播放修剪过的文件并使用AVAudioPlayer获取持续时间,但AVURLAsset的问题是什么我无法弄清楚。
有人可以帮忙吗? 我已经在stackoverflow中尝试了几乎所有这些问题的答案。
答案 0 :(得分:16)
可能你用过
NSURL *itemPathURL = [NSURL URLWithString:outPath];
而不是
NSURL *itemPathURL = [NSURL fileURLWithPath:outPath];
答案 1 :(得分: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)
答案 2 :(得分: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);
答案 3 :(得分: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)
答案 4 :(得分:0)
对于我的情况,必须识别文件名的扩展名,例如“.mp3”。 如果没有,它将返回0。
... let asset = AVURLAsset(url:URL(fileURLWithPath:filefullname),options:nil) ... asset.duration ...
答案 5 :(得分:-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);