2015-11-22 14 views
10

Ho un'app di videochiamata utilizzando l'ultima versione di Quickblox (Quickblox 2.5, Quickblox-WebRTC 2.0) e ho bisogno di salvare il video in streaming sulla chiamata di un file. C'è un vecchio esempio con una vecchia versione dell'SDK che non assomiglia a quella attuale.Quickblox - Come salvare una QBRTCCameraCapture in un file

Non c'è nulla al riguardo nei documenti attuali e non è possibile avviare un AVCaptureMovieFileOutout poiché Quickblox utilizza già un AVCaptureVideoDataOutput. Esiste comunque la possibilità di salvare il flusso su un file?

UPDATE:

sono riuscito a scrivere il video in un file. Tutto ciò che manca è la traccia audio.

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) 
    } 

} 

Tutte le idee su come arrivare al di QBRTCLocalAudioTrack sottostante AVCaptureAudioDataOutput?

risposta

0

Sono del team di sviluppo QuicbkloxWebRTC. La funzione è prevista per la prossima grande uscita.

+0

Non esiste una soluzione alternativa per ottenere l'uscita audio? Il mio cliente è impazzito dal fatto che i video vengano salvati senza audio. – Raphael

+0

WebRTC elabora l'audio in modo nativo con i frame audio, quindi WebRTC mescola l'audio di tutti gli avversari e solo allora abbiamo la possibilità di registrare la traccia audio dal mixer. Ora esaminiamo il record audio separato. – SevenDays

+0

@SevenDays Questa funzione è stata implementata nell'ultimo SDK di iOS, si prega di aggiornare. –

Problemi correlati