2014-03-26 70 views
0

一個單一的形象嘗試這樣的:AVAssetWriter - 渲染10秒

int frameCount = 30*10; 
    for(int i = 0; i<frameCount; i++) 
    { 
     while (!append_ok && j < 30) 
     { 
      if (self.adaptor.assetWriterInput.readyForMoreMediaData) 
      { 

       CMTime frameTime = CMTimeMake(i,(int32_t) 10); 

       NSLog(@"frameTime %f", CMTimeGetSeconds(frameTime)); 

       append_ok = [self.adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; 
       if(!append_ok){ 
        NSError *error = self.assetWriter.error; 
        if(error!=nil) { 
         NSLog(@"Unresolved error %@,%@.", error, [error userInfo]); 
        } 
       } 

       [NSThread sleepForTimeInterval:0.05]; 
      } 
      else 
      { 
       printf("adaptor not ready %d", j); 
       [NSThread sleepForTimeInterval:0.1]; 
      } 
      j++; 
     } 
     if (!append_ok) 
     { 
      printf("error appending image times %d\n", j); 
     } 
     CVBufferRelease(buffer); 
    } 

但我得到這個錯誤:

MyApp的(11658,0x3a98218c)的malloc:*錯誤對象0x1782c690:雙免費

我只是想用一張圖片創建一個持續時間爲10秒的視頻。

+2

你正在釋放緩衝區,然後使用它,並在你的循環中多次釋放它。將CVBufferRelease語句從for循環中移出 – Jack

+0

這確實消除了錯誤。有沒有辦法將像素緩衝區追加十秒鐘,而不是一次追加一幀? – soleil

+1

嗯我不太確定這一點,但如果你在時間0附加一個像素緩衝區,然後在10秒時追加下一個幀,整個持續時間是不是會顯示像素緩衝區? – Jack

回答

0

我知道你的痛苦的傢伙,我有一個類似的方法來爲我工作,根據音頻文件(在CMTime中),使用一幀圖像和指定的持續時間。試試這個(編輯你的代碼):

int frameCount = 1; 
for(int i = 0; i<frameCount; i++) 
{ 
    while (!append_ok && j < 30) 
    { 
     if (self.adaptor.assetWriterInput.readyForMoreMediaData) 
     { 

      CMTime frameTime = CMTimeMake(10, 1); //10 seconds 

      NSLog(@"frameTime %f", CMTimeGetSeconds(frameTime)); 

      append_ok = [self.adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; 
      if(!append_ok){ 
       NSError *error = self.assetWriter.error; 
       if(error!=nil) { 
        NSLog(@"Unresolved error %@,%@.", error, [error userInfo]); 
       } 
      } 

      [NSThread sleepForTimeInterval:0.05]; 
     } 
     else 
     { 
      printf("adaptor not ready %d", j); 
      [NSThread sleepForTimeInterval:0.1]; 
     } 
     j++; 
    } 
    if (!append_ok) 
    { 
     printf("error appending image times %d\n", j); 
    } 
    CVBufferRelease(buffer); 
} 
+0

注意,沒有真正需要循環.... –