2

我想更改电影帧的顺序,然后将它们写回新的视频文件。将它们全部放在数组中对我来说会容易得多,但是将缓冲区样本处理到数组的过程会导致真实设备上的崩溃(但在模拟器中没问题)。我在 Xcode 中看到的只是消息:“丢失与 DEVICE_NAME 的连接”在这个过程的中间 - 没有崩溃日志等。

所以让我们从不会导致任何问题的事情开始:打印每帧的时间戳

CMSampleBufferRef sample;

while(sample = [readerOutput copyNextSampleBuffer]) {
     CMTime timestamp = CMSampleBufferGetPresentationTimeStamp((__bridge CMSampleBufferRef)(__bridge id)sample);
     NSLog(@"%f", (float)timestamp.value / timestamp.timescale);

    CFRelease(sample);
}

但是当我尝试以这种方式将样本缓冲区复制到数组时:

 NSMutableArray *samples = [[NSMutableArray alloc] init];

CMSampleBufferRef sample;
while(sample = [readerOutput copyNextSampleBuffer]) {
    [samples addObject:(__bridge id)sample];
    CMSampleBufferInvalidate(sample);
    CFRelease(sample);
    sample = NULL; 
}

或者这样

  CFMutableArrayRef frameArray = CFArrayCreateMutable(NULL, 1000, &kCFTypeArrayCallBacks);

sample = [readerOutput copyNextSampleBuffer];
while (sample != NULL) {
    sample = [readerOutput copyNextSampleBuffer];

    if (sample != NULL) {
        CFArrayAppendValue(frameArray, sample);
    }

    CFRelease(sample);
}

它崩溃了。我在尝试做一些不可能的事情吗?

4

1 回答 1

0

可以将其转换为 UIImage 然后添加到数组中,但是使用时需要将其转换回 CMSampleBufferRef ,这可能会花费一些时间

于 2017-12-03T02:48:36.603 回答