【问题标题】:NSFileHandle reading corrupt data from Video fileNSFileHandle 从视频文件中读取损坏的数据
【发布时间】:2014-08-01 20:43:53
【问题描述】:

我正在使用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 时,这里的字节是错误的(即使两者的大小完全相同):

我对这种奇怪的行为一无所知,如果您遇到类似的问题,我希望您能提供帮助。

【问题讨论】:

    标签: ios avfoundation nsdata nsfilemanager nsfilehandle


    【解决方案1】:

    我要冒昧地说,NSFileHandle 不可能给你不正确的数据。我认为正在发生的是数据实际上正在被更改(由正在写出它的程序)在你得到数据之后。

    我不知道你到底想要完成什么,所以我不能提出更好的方法。

    我有一些类似的代码从另一个进程正在写出的文件中读取数据,只有我的使用readabilityHandler 而不是NSFileHandleDataAvailableNotification。我没有太多理由相信这会解决您的问题,但值得一试。我知道您可能会遇到NSNotification 的线程问题,所以这可能是值得关注的。

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

    【讨论】:

    • 我很确定这正是正在发生的事情,因为我正在读取正在写入的文件,当它结束时,我正在写入常规数据和从 NSFileHandle 读取的数据和然后才比较它们。文件将在其中更改并且仅针对这 5-6 个字节...
    • @ShaiMishali 如果它只是改变了 5 或 6 个字节,那么我只能推断这些字节正在改变,因为它们代表了(实际)视频数据的 length(随着时间的推移而上升)。
    • 随着视频变长,更多字节发生变化......我认为这与长度没有任何关系,因为这些字节不包含数值......我唯一能想到的是EXIF ...
    • @ShaiMishali 你可能是对的,因为我现在看到 moov 标识符正在发生变化。用更多想法更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 2010-09-16
    • 1970-01-01
    • 2020-05-19
    • 2011-12-27
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多