2016-12-08 8 views
0

Я пытаюсь записать видео с AVAssetWriter, AVCaptureSession, AVCaptureOutput и AVAssetWriterInput.Захваченное видео с AVAssetWriter имеет нулевое значение

Вот метод делегата для AVCaptureOutput, где я добавить буфера:

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

Когда я окончание написания видео в файл, я пытаясь воспроизвести его через MPMoviePlayerController. Данные доступны, потому что файл имеет значительный размер, но по некоторым причинам продолжительность видео равна нулю. Что я делаю не так?

repository с тестовым кодом. Он предназначен для потоковой передачи HLS, поэтому на данный момент он должен сделать 15-секундное видео и после этого отобразить его в проигрывателе в нижней части экрана (теперь игрок просто черный, а длительность видео - 0).

ответ

0

Обязательно позвоните по номеру [AVAssetWriter finishWritingWithCompletionHandler:], когда вы закончите.

Вы должны позвонить startSessionAtSourceTime с меткой времени представления первого получаемого вами буфера.

Вы можете удалить [self.assetWriter endSessionAtSourceTime:kCMTimeZero]; .

+0

Обновленный вопрос с дополнительной информацией, любые другие предложения? –

+0

добавил некоторые предложения –

+0

Обновил мой код, но все еще не работал для меня –

0
[self.assetWriter endSessionAtSourceTime:kCMTimeZero]; 

Вы устанавливаете время окончания сеанса к нулю, что делает запись 0 секунд долго ...

+0

И что мне там установить? Допустим, у меня есть значение NSTimeInterval с длительностью видео. –

+0

Это зависит от ваших кадров и продолжительности. [Посмотрите здесь некоторое объяснение] (http://stackoverflow.com/a/13001917/312312), а также [здесь] (http://stackoverflow.com/questions/4001755/trying-to-understand-cmtime-and- cmtimemake) – Lefteris

+0

Обновлен мой код, но все еще не работал для меня –

 Смежные вопросы

  • Нет связанных вопросов^_^