有没有人知道有没有能力将帧缓冲区从广播上传扩展上传到主机应用程序,或者我应该直接加载到后端?我的目标是从回放工具包中截取帧缓冲区,将它们发送到我的应用程序,并使用Webrtc通过我的应用程序广播视频。都会感谢任何帮助。提前谢谢。
发布于 2016-11-18 19:04:32
广播开始时,仅加载广播上传扩展和广播UI扩展。据我所知,没有一种编程方法可以启动你的主机应用程序,并在后台将任何数据流式传输到它。
但是您可以在Broadcast Upload扩展中实现整个逻辑。您的RPBroadcastSampleHandler实现将提供视频CMSampleBuffer,所有的后处理和上传逻辑都取决于您的实现。因此,您可以解包和处理帧,然后以任何合适的方式上传到您的服务器。如果您需要任何配置或授权细节,您可以简单地在Broadcast UI扩展中设置它们,甚至在您的主机应用程序中设置它们,然后将它们存储在共享存储中。
在互联网上和苹果的文档中都没有太多关于它的信息。但你仍然可以:
upload documentation
RPBroadcastSampleHandler扩展的存根实现(只需在Xcode中创建目标)发布于 2018-06-09 01:24:06
我用Replay Kit和webRTC的组合做了完全相同的事情。iOS上webRTC的基本问题是,如果视频流转到后台,webRTC将无法处理。所以..。当你的视频聊天应用程序在前台时,你可以将你的应用程序的屏幕视频流传输到webRTC,但要流式传输其他应用程序,当你的应用程序转到后台时,你可能无法处理视频流,而只能通过webRTC处理语音。
你最好从upload extension上传到服务器,我已经浪费了太多的时间来连接upload extension到主机应用。上载扩展完全不受控制。
发布于 2018-07-10 19:14:00
我有一些代码给你,我已经在我的项目中实现了它,并在google-group上进行了讨论:https://groups.google.com/d/msg/discuss-webrtc/jAHCnB12khE/zJEu1vyUAgAJ
我将在这里为下一代转移代码:
首先,我在广播扩展中创建了额外的类来管理与WebRTC相关的代码,并将其命名为PeerManager。
设置视频跟踪与本地流,请小心,您应该这样做,然后再生成本地报价。
private func setupVideoStreaming() {
localStream = webRTCPeer.peerConnectionFactory.mediaStream(withStreamId: "\(personID)_screen_sharing")
videoSource = webRTCPeer.peerConnectionFactory.videoSource()
videoCapturer = RTCVideoCapturer(delegate: videoSource)
videoSource.adaptOutputFormat(toWidth: 441, height: 736, fps: 15)
let videoTrack = webRTCPeer.peerConnectionFactory.videoTrack(with: videoSource, trackId: "screen_share_track_id")
videoTrack.isEnabled = true
localStream.addVideoTrack(videoTrack)
for localStream in webRTCPeer.localPeerConnection.peerConnection.localStreams {
webRTCPeer.localPeerConnection.peerConnection.remove(localStream)
}
webRTCPeer.localPeerConnection.peerConnection.add(localStream)
}我从提供CMSampleBuffer的系统得到了回调,我将其转换为RTCVideoFrame并发送到videoSource (模拟VideoCapturer)
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// Handle video sample buffer
guard peerManager != nil, let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
break
}
let pixelFormat = CVPixelBufferGetPixelFormatType(imageBuffer) // kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
let timeStampNs: Int64 = Int64(CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) * 1000000000)
let rtcPixlBuffer = RTCCVPixelBuffer(pixelBuffer: imageBuffer)
let rtcVideoFrame = RTCVideoFrame(buffer: rtcPixlBuffer, rotation: ._0, timeStampNs: timeStampNs)
peerManager.push(videoFrame: rtcVideoFrame)
case RPSampleBufferType.audioApp:
break
case RPSampleBufferType.audioMic:
break
}
}来自peerManager的
代码,它是上述代码中推送功能的实现。这里没有什么奇怪的,我们使用委托来模拟捕获器的行为。
func push(videoFrame: RTCVideoFrame) {
guard isConnected, videoCapturer != nil, isProcessed else {
return
}
videoSource.capturer(videoCapturer, didCapture: videoFrame)
}现在,您已经准备好生成本地报价、发送报价和传输所需的数据。尝试检查您的本地报价,如果您做的一切都正确,您应该在您的报价中看到a=sendonly。
附注:根据VladimirTechMan,的建议,您还可以在AppRTCMobile演示应用程序中查看广播扩展的示例代码。我已经为你找到了链接,它是Objective-C example https://webrtc.googlesource.com/src/+/358f2e076051d28b012529d3ae6a080838d27209你应该对ARDBroadcastSampleHandler.m/.h和ARDExternalSampleCapturer.m/.h文件感兴趣。请不要忘记,您可以根据https://webrtc.org/native-code/ios/说明自行构建它
https://stackoverflow.com/questions/39642404
复制相似问题