IPhone: Как получить продолжительность видео, выбранную из библиотеки?
Я использую UIImagePickerController
для выбора видеофайла из библиотеки. Пользователь может загрузить видео.
Также я использую свойство videoMaximumDuration
, в то время как пользователь хочет захватить видео и загрузить его.
Я хочу знать, как я могу получить продолжительность выбранного видеофайла? так что я могу ограничить пользователя загрузкой видео с продолжительностью более 20 секунд.
Я могу получить базовую информацию о выбранном видео с помощью этого кода:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
NSError *error;
NSDictionary * properties = [[NSFileManager defaultManager] attributesOfItemAtPath:selectedVideoUrl.path error:&error];
NSNumber * size = [properties objectForKey: NSFileSize];
NSLog(@"Vide info :- %@",properties);
}
Но о длительности выбранного видео ничего нет.
Спасибо...
Ответы
Ответ 1
Получено решение: я использую класс AVPlayerItem
и AVFoundation
и CoreMedia
.
#import <AVFoundation/AVFoundation.h>
#import <AVFoundation/AVAsset.h>
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:selectedVideoUrl];
CMTime duration = playerItem.duration;
float seconds = CMTimeGetSeconds(duration);
NSLog(@"duration: %.2f", seconds);
}
Ответ 2
Другой ответ на этот вопрос с использованием AVPlayerItem не сработал у меня, но это было с использованием AVURLAsset:
#import <AVFoundation/AVFoundation.h>
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSURL *videoURL=[info objectForKey:@"UIImagePickerControllerMediaURL"];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSTimeInterval durationInSeconds = 0.0;
if (asset)
durationInSeconds = CMTimeGetSeconds(asset.duration);
}
Ответ 3
Swift
независимо от использования didFinishPickingMediaWithInfo
или didFinishRecordingToOutputFileAtURL
вы можете:
// needed only for didFinishPickingMediaWithInfo
let outputFileURL = info[UIImagePickerControllerMediaURL] as! NSURL
// get the asset
let asset = AVURLAsset(URL: outputFileURL)
// get the time in seconds
let durationInSeconds = asset.duration.seconds
Ответ 4
Если вы используете рамки AVFoundation
и AssetLibrary, вы можете перечислить все активы, применить фильтр только для видео и получить продолжительность каждого видео с помощью метода - (id)valueForProperty:(NSString *)property
. Перейдите в ALAssetPropertyDuration
для свойства. Ниже приведен код ниже на консоли.
номер видеоклипа 0 - 66.80833333333334 секунд
номер видеоклипа 1 составляет 190,06 секунды
номер видеоклипа 2 составляет 13,74 секунды
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
if (!assetItems) {
assetItems = [[NSMutableArray alloc] init];
} else {
[assetItems removeAllObjects];
}
if (!assetLibrary) {
assetLibrary = [[ALAssetsLibrary alloc] init];
}
ALAssetsLibraryGroupsEnumerationResultsBlock listBlock = ^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allVideos]];
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
[assetItems addObject:result];
NSString *duration = [result valueForProperty:ALAssetPropertyDuration];
NSLog(@"video clip number %d is %@ seconds\n",index, duration);
}
}];
}
};
ALAssetsLibraryAccessFailureBlock failBlock = ^(NSError *error) { // error handler block
NSString *errorTitle = [error localizedDescription];
NSString *errorMessage = [error localizedRecoverySuggestion];
NSLog(@"%@...\n %@\n",errorTitle,errorMessage);
};
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:listBlock failureBlock:failBlock];
}
Ответ 5
Swift 3.0 и Swift 4
let outputFileURL = info[UIImagePickerControllerMediaURL] as! URL
// get the asset
let asset = AVURLAsset.init(url: outputFileURL) // AVURLAsset.init(url: outputFileURL as URL) in swift 3
// get the time in seconds
let durationInSeconds = asset.duration.seconds
print("==== Duration is ",durationInSeconds)
Ответ 6
Да, вы можете использовать свойство "продолжительность", определенное MPMediaPlayerController. Попробуйте Plese и проверьте выход. U может ссылаться здесь свойство продолжительности
Попробуйте использовать MPMediaPlayerController для воспроизведения видео, а затем используйте свойство "продолжительность". U сможет четко получить информацию о продолжительности видео.