2016-03-07 80 views
2

我想更改電影幀的順序,然後將它們寫回到新的視頻文件。對於我來說,將它們放在一起會容易得多,但將緩衝區樣本應對陣列的過程會導致實際設備崩潰(但在模擬器中可以正常運行)。我在Xcode中看到的所有信息都是:在此過程中出現「丟失與DEVICE_NAME的連接」 - 沒有崩潰日誌等。應對CMSampleBufferRef數組導致崩潰

因此,讓我們從什麼不會導致任何問題開始:打印每個幀的時間戳

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); 
} 

它崩潰。 我是否嘗試做一些不可能的事情?

回答

0

你可以將其轉換爲UIImage的,然後添加到陣列,但是,你需要隱蔽回CMSampleBufferRef使用時,可能會造成一點時間