【问题标题】:ALAssets get video dataALAssets 获取视频数据
【发布时间】:2013-04-24 16:14:35
【问题描述】:

我正在尝试使用以下代码从 ALAssets 库访问视频数据

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

它适用于小视频和图片,但如果我想获得一个大视频,代码会崩溃说

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSConcreteData initWithBytes:length:copy:freeWhenDone:bytesAreVM:]:荒谬的长度:4294967295,最大大小:2147483648 字节'

我不知道发生了什么。大家有什么想法吗?

提前致谢!

【问题讨论】:

  • 异常发生时rep.size的值是多少?
  • 它的值为522523356

标签: iphone ios crash alassetslibrary


【解决方案1】:

我找到了解决方案。我想崩溃可能是由于我们上传大文件时出现巨大的内存峰值,因为我正在缓冲数据。现在我将文件数据读取为 5 MB 块,这修复了崩溃。我在下面粘贴我的代码。

- (NSData *)getDataPartAtOffset:(NSInteger)offset  {
__block NSData *chunkData = nil;
if (fileAsset_){
    static const NSUInteger BufferSize = PART_SIZE; // 5 MB chunk
    ALAssetRepresentation *rep = [fileAsset_ defaultRepresentation];
    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));
    NSUInteger bytesRead = 0;
    NSError *error = nil;

    @try
    {
        bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:&error];
        chunkData = [NSData dataWithData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];
    }
    @catch (NSException *exception)
    {
        free(buffer);
        chunkData = nil;
        // Handle the exception here...
    }

    free(buffer);
} else {
    NSLog(@"failed to retrive Asset");
}
return chunkData;

}

我将把这个函数称为

   int offset = 0; // offset that keep tracks of chunk data

  do {
        @autoreleasepool {
            NSData *chunkData = [self getDataPartAtOffset:offset];;

            if (!chunkData || ![chunkData length]) { // finished reading data
                break;
            }

            // do your stuff here

            offset +=[chunkData length];
        }
    } while (1);

【讨论】:

    【解决方案2】:

    chilitechno'shere 为我工作。

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 2019-09-07
      • 2017-02-26
      • 2011-10-06
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      相关资源
      最近更新 更多