1

AppleのRosyWriterサンプルコードを最新のObjectiveCに準拠するように変換しました。この方法でARC、5〜10秒のクリップをサーバーにアップロードする方法を読んでいますが、そのcaptureOutput:didOutputSampleBuffer:fromConnection中で何をすべきかわかりません...私のRosyWriterハイブリッド:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);

if (connection == _videoConnection) {
    CMTime timeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
    [self calculateFramerateAtTimestamp:timeStamp];

    if (_videoDimensions.height == 0 && _videoDimensions.width == 0) 
        _videoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);

    if (_videoType == 0) 
        _videoType = CMFormatDescriptionGetMediaSubType(formatDescription);
}

CFRetain(sampleBuffer);
CFRetain(formatDescription);

dispatch_async(movieWritingQueue, ^{
    if (_assetWriter) {
        BOOL wasReadyToRecord = (_readyToRecordAudio && _readyToRecordVideo);

        if (connection == _videoConnection) {
            if (!_readyToRecordVideo)
                _readyToRecordVideo = [self setupAssetWriterVideoInput:formatDescription];

            if (_readyToRecordAudio && _readyToRecordVideo)
                [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo];

        }else if (connection == _audioConnection) {
            if (!_readyToRecordAudio)
                _readyToRecordAudio = [self setupAssetWriterAudioInput:formatDescription];

            if (_readyToRecordVideo && _readyToRecordAudio)
                [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio];

        }

        BOOL isReadyToRecord = (_readyToRecordAudio && _readyToRecordVideo);

        if (!wasReadyToRecord && isReadyToRecord) {
            _recordingWillBeStarted = NO;
            _recording = YES;
            [_delegate recordingDidStart];
        }
    }

    CFRelease(sampleBuffer);
    CFRelease(formatDescription);
});
}

次に、次のようにサンプルバッファを書き込みます。

-(void)writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString*)mediaType {
if (_assetWriter.status == AVAssetWriterStatusUnknown) {
    if ([_assetWriter startWriting]) {
        [_assetWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
    }else {
        [self showError:[_assetWriter error] source:@"Write sample buffer"];
    }
}

if (_assetWriter.status == AVAssetWriterStatusWriting) {
    if (mediaType == AVMediaTypeVideo) {
        if (_videoInput.readyForMoreMediaData) {
            if (![_videoInput appendSampleBuffer:sampleBuffer]) {
                [self showError:[_assetWriter error] source:@"set up video asset writer"];
            }
        }
    }else if (mediaType == AVMediaTypeAudio) {
        if (_audioInput.readyForMoreMediaData) {
            if (![_audioInput appendSampleBuffer:sampleBuffer]) {
                [self showError:[_assetWriter error] source:@"set up audio asset writer"];
            }
        }
    }
}
}

今私の質問は...またはメソッドassetWriterでを作成して交換する必要がありますか?ffmpeg-ios内で確認できることから、個別のクラスにカスタムメソッドを持つクラスが実装されており、そのうちの1つは5秒ごとにセグメント化されたエンコーダーです...しかし、このアップロードをサーバーに行うにはどうすればよいですか?captureOutput:didOutputSampleBuffer:fromConnection:writeSampleBuffer:ofType:writeSampleBuffer:ofTypeassetWriter

4

0 に答える 0