Ich habe eine Videoanruf-App mit der neuesten Quickblox-Version (Quickblox 2.5, Quickblox-WebRTC 2.0) und ich muss das Video Streaming auf dem Anruf eine Datei speichern. Es gibt ein altes Beispiel mit einer alten Version des SDK, die nicht wie die aktuelle aussieht.Quickblox - So speichern Sie eine QBRTCCameraCapture in eine Datei
Es gibt nichts darüber in der aktuellen Dokumentation und ich kann ein AVCaptureMovieFileOutout nicht starten, da Quickblox bereits ein AVCaptureVideoDataOutput verwendet. Gibt es trotzdem den Stream in einer Datei zu speichern?
UPDATE:
ich es geschafft, das Video in eine Datei zu schreiben. Alles, was fehlt, ist die Audiospur.
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)
}
}
Irgendwelche Ideen auf, wie man QBRTCLocalAudioTrack zugrunde liegenden AVCaptureAudioDataOutput zu bekommen?
Gibt es keine Ausweichlösung für die Audioausgabe? Mein Klient flippt aus, dass die Videos ohne Ton gespeichert werden. – Raphael
WebRTC verarbeitet Audio nativ mit Audioframes, dann mischt WebRTC Audio von allen Gegnern und nur dann können wir Audiotracks vom Mixer aufnehmen. Jetzt untersuchen wir separate Audioaufzeichnungen. – SevenDays
@SevenDays Wurde diese Funktion im neuesten iOS SDK implementiert, aktualisieren Sie sie bitte. –