搜尋

首頁  >  問答  >  主體

objective-c - iOS 如何拿到相册中的视频文件

我做的是iOS开发。
需要实现的功能: 从手机相册中导入视频文件到我的APP中(后续会对这个文件进行操作).
遇到的障碍:我拿不到相册中的视频文件的实际地址(文件路径),最多只能拿到它在相册中的URL。
求大神帮忙解决下问题,感激不尽。

以下是我的部分代码,我需要再注释处获得文件路径:
-(void)assetPickerController:(ZYQAssetPickerController )picker didFinishPickingAssets:(NSArray )assets{

//TODO:
for (ALAsset *asset in assets) {
    NSLog(@"HERE\n asset.defaultRepresentation.url = %@\n asset.defaultRepresentation.filename = %@",asset.defaultRepresentation.url, asset.defaultRepresentation.filename);
    [self saveVideoToApp:nil asset:asset];
// 我想在这里拿到视频文件
}

}

以下是我的打印数据
2015-11-13 20:51:57.556 MyApp[1244:499923] HERE
asset.defaultRepresentation.url = assets-library://asset/asset.MOV?id=08A49AFB-8FA6-4F69-824F-A34CB168CAAA&ext=MOV
asset.defaultRepresentation.filename = IMG_0006.MOV

多谢
怪我咯怪我咯2772 天前663

全部回覆(4)我來回復

  • 阿神

    阿神2017-04-17 17:30:08

    哥們問題解決了嗎 可以給個思路嗎

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:30:08

    透過ALAsset的方式,無法取得系統相簿中檔案的具體路徑,一般採取的方式是透過ALAssetRepresentation直接取得視訊數據,如果還需要一個fileURL的話,可以將視訊資料寫入自訂fileURL的檔案中,範例程式碼如下:

    -(void)assetPickerController:(ZYQAssetPickerController )picker didFinishPickingAssets:(NSArray )assets{
    
        //TODO:
        for (ALAsset *asset in assets) {
            NSLog(@"HERE\n asset.defaultRepresentation.url = %@\n asset.defaultRepresentation.filename = %@",asset.defaultRepresentation.url, asset.defaultRepresentation.filename);
        
            [self saveVideoToApp:nil asset:asset];
            // 我想在这里拿到视频文件
            
            ALAssetRepresentation *representation = asset.defaultRepresentation;
            if ([mediaType isEqualToString:ALAssetTypeVideo]) {
                long long size = representation.size;
                NSMutableData* data = [[NSMutableData alloc] initWithCapacity:size];
                void* buffer = [data mutableBytes];
                [representation getBytes:buffer fromOffset:0 length:size error:nil];
                NSData *fileData = [[NSData alloc] initWithBytes:buffer length:size];
                
                //File URL
                NSString *savePath = [NSString stringWithFormat:@"%@%@", [NSHomeDirectory() stringByAppendingString:@"/tmp/"], representation.filename];
                [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil];
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)   {
            [fileData writeToFile:savePath atomically:NO];
            
            });
    
            }
        }
    }

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:30:08

    雷雷

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 17:30:08

    。 。 。為何還沒解決。

    首先你播放這個文件,完全不需要匯出!

    ALAsset *alasset = ...;
    AVAsset *avasset = [AVAsset assetWithURL:alasset.defaultRepresentation.url];
    

    這個AVAsset就可以用作,播放,編輯,等等。

    然後你需要到處的話,就可以用

    AVAssetExportSession *session = [AVAssetExportSession exportSessionWithAsset:avasset presetName:AVAssetExportPresetHighestQuality];
    session.outputFileType = AVFileTypeMPEG4;
    session.outputURL = ...; // 这个就是你可以导出的文件路径了。
    
    [session exportAsynchronouslyWithCompletionHandler: ...];

    然後這個方式可以加入很多的參數來幫助你匯出。具體可以看​​一下AVComposition,嗯。

    回覆
    0
  • 取消回覆