web-dev-qa-db-ja.com

ALAsset URLiOSからビデオNSDataを取得します

ALAssetから取得したURLからNSDataを取得できません

以下は私が試したコードです:-私は常にNSDataをnilとして取得します。

 NSData *webData = [NSData dataWithContentsOfURL:[asset defaultRepresentation].url];

私もこのようなことを試みました

 NSData *webData1 = [NSData dataWithContentsOfURL:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]]];

ALAssetから取得したURL:-

アセット-library://asset/asset.MOV?id = 1000000116&ext = MOV

私はこれを機能する以下のリンクを試しましたが、非常に時間がかかる一時的な場所に不必要に書き込む必要があります。

ALAssetからビデオを取得

正しい方向へのヒントをいただければ幸いです。

返信を待っています

14
Ekra

このコードを試してください:-

ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((NSUInteger)rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(NSUInteger)rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
61
Leena

バイトバッファ=(バイト)malloc(rep.size); rep.sizeが非常に大きい場合、おそらく300Mの場合、クラッシュします。したがって、次のコードを試してください。

+ (BOOL)writeDataToPath:(NSString*)filePath andAsset:(ALAsset*)asset
{
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
    if (!handle) {
        return NO;
    }
    static const NSUInteger BufferSize = 1024*1024;

    ALAssetRepresentation *rep = [asset defaultRepresentation];
    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));
    NSUInteger offset = 0, bytesRead = 0;

    do {
        @try {
            bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:nil];
            [handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];
            offset += bytesRead;
        } @catch (NSException *exception) {
            free(buffer);

            return NO;
        }
    } while (bytesRead > 0);

    free(buffer);
    return YES;
}
17
riven