2016-12-08 3 views
0

AVAssetWriter, AVCaptureSession, AVCaptureOutputAVAssetWriterInput으로 비디오를 캡처하려고합니다. 마무리 쓰기 위해AVAssetWriter로 캡처 한 비디오의 지속 시간이

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 


    if (self.assetWriter.status != AVAssetWriterStatusWriting) { 

     CMTime startTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 

     [self.assetWriter startWriting]; 

     [self.assetWriter startSessionAtSourceTime:startTime]; 
    } 
    if ([captureOutput isKindOfClass:AVCaptureVideoDataOutput.class] && self.videoWriterInput.isReadyForMoreMediaData) { 

     [self.videoWriterInput appendSampleBuffer:sampleBuffer]; 
    } 
    else if ([captureOutput isKindOfClass:AVCaptureAudioDataOutput.class] && self.audioWriterInput.isReadyForMoreMediaData) { 

     [self.audioWriterInput appendSampleBuffer:sampleBuffer]; 
    } 
} 

및 방법 :

- (void)finishCurrentWriting { 

    [self.videoWriterInput markAsFinished]; 
    [self.audioWriterInput markAsFinished]; 

    __weak ViewController *weakSelf = self; 

    [self.assetWriter finishWritingWithCompletionHandler:^{ 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      [weakSelf runVideo]; 
     }); 
    }]; 
} 

내가 파일에 쓰기 비디오를 종료하고있어, 난 내가 버퍼를 추가 해요 곳에있다

AVCaptureOutput 위양 방법입니다 MPMoviePlayerController을 통해 재생하려고합니다. 파일의 크기가 크기 때문에 데이터를 사용할 수 있지만 몇 가지 이유로 동영상 길이는 0입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

테스트 코드가 포함 된 repository이 추가되었습니다. 그것은 HLS 스트리밍을위한 것입니다. 그래서 지금은 15s 비디오를 만들어야합니다. 그리고 플레이어의 화면 하단에 디스플레이해야합니다 (이제 플레이어는 검은 색이고 비디오 길이는 0입니다).

답변

0

완료하면 [AVAssetWriter finishWritingWithCompletionHandler:]으로 전화하십시오.

startSessionAtSourceTime에 수신하는 첫 번째 버퍼의 표시 시간 스탬프가 있어야합니다.

[self.assetWriter endSessionAtSourceTime:kCMTimeZero]; 을 삭제할 수 있습니다.

+0

업데이트 질문, 어떤 다른 제안? –

+0

몇 가지 제안 사항을 추가했습니다 –

+0

내 코드는 업데이트되었지만 여전히 작동하지 않습니다 –

0
[self.assetWriter endSessionAtSourceTime:kCMTimeZero]; 
당신은 녹화 0초 긴 만들기 0으로 세션 종료 시간을 설정하는

... 더 많은 정보와

+0

을 추가했는데 어떻게해야합니까? 말하자면, 비디오 길이가 NSTimeInterval 값입니다. –

+0

이것은 fps와 지속 시간에 따라 다릅니다. [여기에 몇 가지 설명을보십시오] (http://stackoverflow.com/a/13001917/312312) 및 [여기] (http://stackoverflow.com/questions/4001755/trying-to-understand-cmtime-and- cmtimemake) – Lefteris

+0

내 코드가 업데이트되었지만 여전히 작동하지 않습니다. –