1

以下のコードを使用して、ビデオファイルパスのみを保存しようとしています(実行したり、メディアプレーヤービューを開いたりしないでください)。

問題は、ピッカーコントローラーでビデオのサムネイルをクリックすると、メディアプレーヤービューでビデオが自動的に開くことです。パスを保存したいのですが、ユーザーが再生ボタンを押すときに使用したいと思います。

もう少し説明しましょう。2つのビューがあります。MainViewには2つのボタンがあり、1つのボタンUIImagePickerControllerはビデオを開いて選択するためのOPEN、1つのボタンは同じ選択したビデオを再生するためのPLAYです。私がここでやろうとしているのは、ユーザーが[開く]ボタンUIImagePickerControllerをクリックして開いてビデオを選択できるようにし、ユーザーがビデオのサムネイルUIImagePickerControllerをクリックしたときMainViewに閉じて(開くボタンと再生ボタンがある場合)開く必要があるということです。 。次に、ユーザーが映画を再生したい場合は、[再生]ボタンをクリックして映画を視聴します。

しかし、このコードでは、のムービーサムネイルをクリックUIImagePickerControllerすると、メディアビューアに移動します。

- (IBAction)openPicker:(id)sender {

    mediaPickerController = [[UIImagePickerController alloc] init];
    NSArray *types = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerQualityTypeHigh];
    mediaPickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    mediaPickerController.delegate = self;
    mediaPickerController.mediaTypes = types;
    mediaPickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
    mediaPickerController.delegate = nil; 

   [self presentModalViewController:mediaPickerController animated:YES]; 


}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    videoPath = [info objectForKey:UIImagePickerControllerMediaURL];
    NSLog(@"videoPath: %@", videoPath);
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];

}
4

2 に答える 2

1

2つの方法があります...

  1. permitEditingNOに設定します。これはメディアビューアを表示するべきではありませんが、私はUIImagePickerControllerを日常的に使用していないため、100%確信が持てないので、テストする必要があります。ただし、機能する場合でも、ビデオが10分より長い場合は、ビデオをトリミングする必要があるため、編集インターフェイスは引き続き存在します(UIImagePickerControllerのドキュメントを参照してください)。しかし、私が書いたように、それをテストします。なぜなら、私はそれを使用しないので間違っている可能性があるからです。

  2. ALAssetsLibraryを見てください。このクラス(および友達)を使用すると、数分でカスタムピッカーを作成できます。その後、やりたいことは何でもできます。ただし、このアプローチには1つの小さな問題があります。ユーザーは、アプリケーションが位置情報にアクセスできることに同意する必要があります。これは、ユーザーにとって非常に誤解を招く恐れがあります。これは、アセットに位置情報を含めることができるためです。ユーザーがアプリケーションの位置情報へのアクセスを無効にすると、カスタムピッカーは機能しなくなります。


更新、コメントで要求されたコード。

グループリストを取得する(このコードはすべてのグループを取得し、ビデオのないグループを除外します):

if ( ! __assetsLibrary ) {
  __assetsLibrary = [[ALAssetsLibrary alloc] init];
}
[__assetsLibrary enumerateGroupsWithTypes:__assetsGroupType
                               usingBlock:^( ALAssetsGroup *group, BOOL *stop ) {
                                 /*
                                  * If group is nil => end of iteration, no more groups will arrive.
                                  */
                                 if ( group ) {
                                   /*
                                    * We do only want groups with videos, so, set filter to allVideos. Following
                                    * numberOfAssets method respects filter settings, so, only number of videos
                                    * is returned.
                                    */
                                   [group setAssetsFilter:[ALAssetsFilter allVideos]];
                                    if ( [group numberOfAssets] > 0 ) {
                                      TMDCONDLOG( DEBUG_PICKER, @"Asset group added: %@", [group valueForProperty:ALAssetsGroupPropertyName ]);
                                      [__assetsGroups addObject:group];
                                    } else {
                                      TMDCONDLOG( DEBUG_PICKER, @"Skipping %@, no videos inside", [group valueForProperty:ALAssetsGroupPropertyName] );
                                    }
                                 } else {
                                   // group is nil, no more groups will arrive, reload table
                                   TMDCONDLOG( DEBUG_PICKER, @"Asset groups count: %d", (int)[__assetsGroups count]);
                                   dispatch_async( dispatch_get_main_queue(), ^{
                                     [self reloadDataFinished];
                                   } );
                                 }
                               }
                             failureBlock:^( NSError *error) {
                               TMDCONDLOG( DEBUG_PICKER, @"Failed: %@", error );
                               dispatch_async(dispatch_get_main_queue(), ^{
                                 [self reloadDataFinished];
                                 [self showAccessFailedError];
                               });
                             }];

列挙するコードは次のALAssetsGroupとおりです。

[__assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stopEnumeratingAssets ) {
  TMDCONDLOG( DEBUG_ASSETS, @"Asset: %@ Index: %d", result, ( int ) index );
  if ( result  ) {
    [__assets addObject:result];
  }

  /*
   * Enumeration ends? If yes, reload table.
   */
  if ( ! result || index == NSNotFound ) {
    *stopEnumeratingAssets = YES;
    TMDCONDLOG( DEBUG_ASSETS, @"Going to reload table view" );
    [self performSelectorOnMainThread:@selector(reloadTableData) withObject:nil waitUntilDone:NO];
  }
}];

グループのアセット数、ポスター画像などを取得する方法の例を次に示します。

__groupAssetsCountLabel.text = [NSString stringWithFormat:@"(%d)", (int) [__assetsGroup numberOfAssets]];    
__groupTitleLabel.text = ( NSString * )[__assetsGroup valueForProperty:ALAssetsGroupPropertyName];
__groupImageView.image = [UIImage imageWithCGImage:[__assetsGroup posterImage]];

これをグループのカスタムUITableViewCellで使用します。アセットのサムネイルと期間を取得する方法の例を次に示します。

dispatch_async( dispatch_get_main_queue(), ^{
  __assetView.image = [UIImage imageWithCGImage:[__asset thumbnail]];
} );
id property = [__asset valueForProperty:ALAssetPropertyDuration];
if ( ! [property isEqual:ALErrorInvalidProperty] ) {
  NSInteger duration = ( ( NSNumber * )property ).integerValue;
  __durationLabel.text = [NSString stringWithFormat:@"%d:%02d", ( int ) ( duration / 60 ), ( int ) ( duration % 60 ) ];
} else {
  __durationLabel.text = nil;
}

カスタムでこのコードを使用して、UITableViewCell4つのアセットを連続して表示し、AppleのピッカーUIをエミュレートできます。


マクロの例..。

#define TMLOG( __xx, ... ) NSLog( @"%s(%d): " __xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ )

#ifdef DEBUG
#define TMDLOG( __xx, ... ) TMLOG( __xx, ##__VA_ARGS__ )
#else
#define TMDLOG( __xx, ... ) ((void)0)
#endif

#ifdef DEBUG
#define TMDCONDLOG( __cond, __xx, ... ) { \
if ( ( __cond ) )  { \
TMDLOG( __xx, ##__VA_ARGS__ ); \
} \
} ((void)0)
#else
#define TMDCONDLOG( __cond, __xx, ... ) ((void)0)
#endif
于 2012-07-16T12:48:53.323 に答える
0

これをあなたに追加してください

openPicker: method.

mediaPickerController.mediaTypes =
    [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];

更新しました

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{

[picker dismissModalViewControllerAnimated:YES];

}
于 2012-07-16T12:12:34.443 に答える