sincronizar - iPhone: ¿Cómo obtener la duración del video seleccionado de la biblioteca?
porque no puedo sincronizar mi iphone con itunes (6)
Estoy usando UIImagePickerController
para elegir el archivo de video de la biblioteca. Y el usuario puede subir el video.
También estoy usando la propiedad videoMaximumDuration
mientras el usuario quiere capturar el video y cargarlo.
Quiero saber que ¿Cómo puedo obtener la duración del archivo de video seleccionado? de modo que puedo restringir al usuario para que cargue un video que tenga una duración de más de 20 segundos.
Puedo obtener información básica sobre el video seleccionado mediante este código:
- (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);
}
Pero no hay nada acerca de la duración del video seleccionado.
Gracias...
En el caso de que utilice los AVFoundation
y AssetLibrary, puede enumerar todos los activos, aplicar el filtro solo para videos y obtener la duración de cada uno de ellos con el método - (id)valueForProperty:(NSString *)property
. Pase en ALAssetPropertyDuration
para la propiedad. El siguiente código imprime lo siguiente en la consola.
el videoclip número 0 es 66.80833333333334 segundos
el videoclip número 1 es 190.06 segundos
el videoclip número 2 es 13.74 segundos
- (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];
}
La otra respuesta a esta pregunta usando AVPlayerItem no me funcionó, pero esto sí lo hizo usando 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);
}
Sí, puede usar la propiedad "duración" definida por MPMediaPlayerController. Por favor probarlo y comprobar la salida. Puede referirse a la propiedad de duración aquí.
Intente usar el MPMediaPlayerController para reproducir el video y luego use la propiedad "duration". U podrá obtener claramente los detalles sobre la duración del video.
Swift 3.0 y 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)
Tengo la solución: uso la clase AVFoundation
y el marco AVFoundation
y 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);
}
Swift 4
independientemente de usar didFinishPickingMediaWithInfo
o didFinishRecordingToOutputFileAtURL
puede:
// needed only for didFinishPickingMediaWithInfo
let outputFileURL = info[UIImagePickerControllerMediaURL] as! URL
// get the asset
let asset = AVURLAsset(url: outputFileURL)
// get the time in seconds
let durationInSeconds = asset.duration.seconds