- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个使用最新 Quickblox 版本(Quickblox 2.5、Quickblox-WebRTC 2.0)的视频通话应用程序,我需要将通话中流式传输的视频保存为一个文件。有一个使用旧版本 SDK 的旧示例,它看起来与当前版本完全不同。
当前文档中没有关于此的内容,我无法启动 AVCaptureMovieFileOutout,因为 Quickblox 已经在使用 AVCaptureVideoDataOutput。有没有办法将流保存到文件?
更新:
我设法将视频写入文件。所缺少的只是音轨。
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 有什么想法吗?
最佳答案
我来自开发 QuicbkloxWebRTC 团队。该功能计划用于下一个大版本。
关于ios - Quickblox - 如何将 QBRTCCameraCapture 保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857572/
Quickblox 经常记录以下内容: Performing async request: RestRequest: ------ POST http://api.quickblox.com/sess
我在我的 C# (Xamarin) 应用程序中使用 Quickblox。我无法移植 Windows Phone 代码,因此我决定使用 RESTful API。 我在获取 token 时遇到问题。我关注
我按照下面的快速 blox 给出的说明进行操作: 从 sdk 2.6.1 开始添加对特定模块的依赖只需添加: dependencies { compile("com.quickblox:quic
我已经为 JS 的 QuickBlox 聊天示例添加了一个功能,它允许向现有聊天添加新用户 函数 addUsers(){ var curDlgId = currentDialog._id ; var
我试图在我的网站上使用 quickbox javascript api 作为聊天应用程序。我使用了 quickblox 示例并且运行良好。但我不明白如何创建新用户。任何人都有关于此分享的任何代码或教程
[QBRequest signUp: user successBlock: ^ (QBResponse * response, QBUUser * user) { // your f
我正在使用 quickblox 开发应用程序的聊天模块。它工作正常。但是当应用程序终止时,我没有收到任何聊天消息的推送通知。任何人都可以帮助我吗? 最佳答案 如果您想收到推送通知,您需要验证以下步骤。
我是 iOS 新手。我正在使用自定义身份验证。我检查了示例代码,我很困惑,他们如何在用户登录时更新用户面板中的注册用户。 请告诉我应该如何使用他们的代码,我下载并运行了他们的示例代码,但它已经过时并且
我是 QuickBlox 新手。我刚刚从 SimpleSample-chat users-ios 下载示例代码并将其与我在 QuickBlox 上的应用程序连接。 注册和正常登录都可以正常工作。 但是
我正在尝试通过 QUICKBLOX 加入一个群组,并在编译我的加入群组代码之后。它向我展示了这个错误。 (Error Domain=com.quickblox.chat Code=-1004 "(nu
我正在使用 Quickblox 的 REST API。但每次,我都会收到回复: {"errors": { "base": ["Required session does not exist"] }
我目前正在涉足Android开发,并且有一个Android Studio项目,正在尝试将QuickBlox sdk添加到我的项目中。我尝试按照提供的说明进行操作,但发现它不起作用。通过一些研究,我发现
使用“自定义模块”时,是否有 API 可以获取所有类的列表? 由于可能会不时通过管理面板添加新类,因此应用程序将需要动态检索所有类。 最佳答案 没有标准的 API 可以做到这一点,但您可以创建类,例如
有什么方法可以查出 Quickblox 用户是否在线?我正在使用 Quickblox iOS SDK。 最佳答案 有两种方法: 使用 REST API - 这是指南 http://quickblox.
有什么办法可以查到Quickblox用户是否在线?我正在使用 Quickblox iOS SDK。 最佳答案 有两种方式: 使用 REST API - 这是指南 http://quickblox.co
- (void)loadUserInfoForId:(int)userId { NSMutableDictionary *getRequest = [NSMutableDictionary d
我是否可以对 quickblox 中的对象进行等效的 sql 连接,以便我可以在一次 api 调用中获取所有信息? 例如: 如果我有一个名为购买的自定义对象,这可能包含有关购买的详细信息,但也将包含
当用户尝试登录(确实登录)并忘记密码时,他会尝试重置密码,然后应用程序如何通过电子邮件调用 Rest Password,因为用户尚未登录 Quickblox。用户是否不需要登录 QuickBlox 才
我正在尝试将通知从 quickblox js sdk 推送到 ios。我有一些示例代码。 QuickBlox JavaScript SDK:2.12.7 'use strict'; const Qui
所以我刚刚开始与 QB 合作并尝试实现视频聊天。我从他们的示例中获取了代码并对其进行了一些修改。我可以连接两个有声音的设备,但没有显示任何视频。我确实在日志中注意到了这条消息: -[QBCha
我是一名优秀的程序员,十分优秀!