NSFileHandle从视频文件中读取损坏的数据

时间:2014-08-01 20:43:53

标签: ios avfoundation nsdata nsfilemanager nsfilehandle

我正在使用NSFileHandle获取正在录制的视频数据。

通知工作正常,我使用NSFileHandleDataAvailableNotification收到通知。问题是视频文件最终无法正常工作。

每次将原始文件与使用NSFileHandle数据创建的文件进行比较时,总会有几个字节错误,这意味着NSFileHandle会错误地读取它们。

这是我追加数据的方式

-(void) gotData: (NSNotification *) not{
    NSFileHandle *handle    = not.object;
    NSData *data            = [handle availableData];

    if(data.length){
        NSLog(@"got %d", data.length);
        [test appendData: data];
        [handle waitForDataInBackgroundAndNotify];
    }else{
        NSLog(@"Ended");
        [[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleDataAvailableNotification object: handle];
    }
}

这就是我最终编写数据的方式:

[test writeToFile:[NSTemporaryDirectory() stringByAppendingPathComponent:@"x.mp4"] atomically:YES];

当在原始文件和NSFileHandle中的文件之间执行 diff 时,这里的字节错误(即使两者的大小完全相同): enter image description here

我真的对这种陌生人的行为一无所知,如果你遇到类似的问题,我会非常乐意帮助你。

1 个答案:

答案 0 :(得分:0)

我会在这里走出去,说NSFileHandle没有办法给你不正确的数据。我认为正在发生的事情是数据实际上正在被更改(通过正在编写的程序)获得数据之后。

我不知道你想要完成什么,所以我不能建议一个更好的方法。

我有一些类似的代码从另一个进程写出的文件中读取数据,只有我使用readabilityHandler代替NSFileHandleDataAvailableNotification。我没有太多理由相信这会解决你的问题,但这是一个尝试。我知道您可能遇到NSNotification的线程问题,因此可能需要注意。

您可能应该使用[NSFileHandle offsetInFile](并根据收到的数据与您的预期位置进行比较)来检查事情是否正在倒闭或其他事情。