最新のQuickbloxバージョン(Quickblox 2.5、Quickblox-WebRTC 2.0)を使用しているビデオコールアプリがあり、ファイルを呼び出すときにビデオをストリーミングして保存する必要があります。 SDKの古いバージョンの古い例がありますが、現在のSDKのようには見えません。Quickblox - QBRTCCameraCaptureをファイルに保存する方法
現在のドキュメントには何もありません。また、AVCaptureVideoDataOutputを既に使用しているため、AVCaptureMovieFileOutoutを開始できません。ストリームをファイルに保存する方法はありますか?
UPDATE:
私は、ファイルにビデオを書き込むことができました。不足しているのはオーディオトラックだけです。
import Foundation
class VideoManager : NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
static let sharedInstance = VideoManager()
var pixelBufferAdaptor: AVAssetWriterInputPixelBufferAdaptor?
var assetWriterInput: AVAssetWriterInput?
var assetWriter: AVAssetWriter?
var frameNumber: Int64 = 0
var qbDelegate: AVCaptureVideoDataOutputSampleBufferDelegate?
func startSavingCaptureToFileWithURL(url: NSURL, capture: QBRTCCameraCapture) {
print("[VideoManager]: startSavingCaptureToFileWithURL")
guard let dataOutput = getVideoCaptureDataOutput(capture) else { return }
frameNumber = 0
qbDelegate = dataOutput.sampleBufferDelegate
dataOutput.setSampleBufferDelegate(self, queue: dataOutput.sampleBufferCallbackQueue)
let outputSettings: [String : AnyObject] = [
AVVideoWidthKey : 720,
AVVideoHeightKey: 1280,
AVVideoCodecKey : AVVideoCodecH264
]
assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: outputSettings)
pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: assetWriterInput!, sourcePixelBufferAttributes: [kCVPixelBufferPixelFormatTypeKey as String : NSNumber(unsignedInt: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)])
do {
assetWriter = try AVAssetWriter(URL: url, fileType: AVFileTypeMPEG4)
assetWriter!.addInput(assetWriterInput!)
assetWriterInput!.expectsMediaDataInRealTime = true
assetWriter!.startWriting()
assetWriter!.startSessionAtSourceTime(kCMTimeZero)
}
catch {
print("[VideoManager]: Error persisting stream!")
}
}
func stopSavingVideo() {
assetWriter?.finishWritingWithCompletionHandler { [weak self] in
guard let strongSelf = self else { return }
strongSelf.frameNumber = 0
}
}
private func getVideoCaptureDataOutput(videoCapture: QBRTCCameraCapture) -> AVCaptureVideoDataOutput? {
var output: AVCaptureVideoDataOutput?
videoCapture.captureSession.outputs.forEach{ captureOutput in
if captureOutput is AVCaptureVideoDataOutput {
output = captureOutput as? AVCaptureVideoDataOutput
}
}
return output
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
qbDelegate?.captureOutput?(captureOutput, didOutputSampleBuffer: sampleBuffer, fromConnection: connection)
guard let assetWriterInput = assetWriterInput else { return }
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
if assetWriterInput.readyForMoreMediaData {
pixelBufferAdaptor?.appendPixelBuffer(imageBuffer, withPresentationTime: CMTimeMake(frameNumber, 25))
}
frameNumber++
}
func getUniqueFileURL() -> NSURL {
let guid = NSProcessInfo.processInfo().globallyUniqueString
let fileName = "\(guid).mp4"
return NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(fileName)
}
}
QBRTCLocalAudioTrackの基礎となるAVCaptureAudioDataOutputの入手方法に関するアイデアはありますか?
オーディオ出力を取得するための回避策はありませんか?私のクライアントは、ビデオがサウンドなしで保存されていることに驚いています。 – Raphael
WebRTCは音声をネイティブにオーディオフレームで処理し、WebRTCはすべての相手からの音声をミックスし、ミキサーからオーディオトラックを録音することができます。今度は別のオーディオレコードを調べます。 – SevenDays
@SevenDaysこの機能は最新のiOS SDKに実装されていますか?更新してください。 –