web-dev-qa-db-ja.com

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);
}

しかし、選択したビデオの長さについては何もありません。

ありがとう...

20
Maulik

解決策を得ました:私は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);
}
30
Maulik

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);
}
30
etayluz

Swift 4

didFinishPickingMediaWithInfoまたはdidFinishRecordingToOutputFileAtURLの使用に関係なく、次のことができます。

// 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
8
budidino

Swift3.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)
2
Gurjinder Singh

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];
}
2
Loozie

はい、MPMediaPlayerControllerで定義されたプロパティ「duration」を使用できます。 Pleseで試して、出力を確認してください。 Uはここを参照できます 期間プロパティ

MPMediaPlayerControllerを使用してビデオを再生してから、プロパティ「duration」を使用してみてください。 Uは、ビデオの長さに関する詳細を明確に取得できるようになります。

1