如何在广播上传扩展(iOS)中实现上传?

Posted

技术标签:

【中文标题】如何在广播上传扩展(iOS)中实现上传?【英文标题】:How to implement uploading in broadcast upload extension (iOS)? 【发布时间】:2017-01-31 05:31:08 【问题描述】:

有人知道是否可以将帧缓冲区从广播上传扩展上传到主机应用程序,或者我应该将它们直接加载到后端?我的目标是从重播工具包中截取帧缓冲区,将它们发送到我的应用程序并使用 Webrtc 通过我的应用程序广播视频。 将不胜感激任何帮助。提前致谢。

【问题讨论】:

能否分享您找到的解决方案。它可能是我们应该使用的文本算法或源代码(最好的方法)。先感谢您。附言我很感兴趣:你是如何将数据从扩展程序传输到主应用程序的,以及如何对样本进行编码以将它们传输到 webRTC。 【参考方案1】:

广播开始时仅加载广播上传扩展和广播 UI 扩展。据我所知,没有任何程序化方式可以启动您的主机应用程序并在后台将任何数据流式传输到它。

但是您可以在广播上传扩展中实现整个逻辑。您的RPBroadcastSampleHandler 实现由视频CMSampleBuffers 提供。所有后处理和上传逻辑都取决于实现。因此,您可以解压缩和处理帧,然后以任何合适的方式上传到您的服务器。如果您需要任何配置或授权详细信息,您只需在广播 UI 扩展甚至您的主机应用程序中设置它们,然后将它们存储在共享存储中。

在互联网和 Apple 文档中没有太多关于它的信息。但您仍然可以:

观看 WWDC 2016 视频Go Live with ReplayKit 阅读RPBroadcastSampleHandler 文档 阅读这篇非常有用的博文(中文):http://blog.lessfun.com/blog/2016/09/21/ios-10-replaykit-live-and-broadcast-extension/ 玩转上传扩展的存根实现(只需在 Xcode 中创建目标)

【讨论】:

【参考方案2】:

我对@9​​87654321@ 和 webRTC 组合进行了完全相同的尝试。 iOS 上 webRTC 的根本问题,webRTC 进入后台时无法处理视频流。所以..当您的视频聊天应用程序处于前台时,您可以将应用程序的屏幕视频流流式传输到 webRTC,但是要流式传输其他应用程序,当您的应用程序进入后台时,您可能无法处理视频流,而只能处理 webRTC 上的语音。

您最好从上传扩展将其上传到服务器,我已经浪费了太多时间将上传扩展连接到主机应用程序.. 绝对无法控制上传扩展。

【讨论】:

第二。只是在同样的方法上浪费了两个星期。工作得很好,直到应用程序进入后台。如果您强制 webrtc 使用 vp8 软件编码,我觉得它可以工作,但我无法坚持设置。 您是尝试为此实现广播扩展,还是只是从应用程序本身进行流式传输? 同时,即使在后台也可以通过 WebRTC 进行流式传输。使用 ReplayKit 2 功能捕获整个屏幕 我想知道您是否尝试实现广播扩展或只是从您的应用程序本身流式传输?广播扩展似乎即使在后台也应该工作【参考方案3】:

我有一些代码给你,我已经在我的项目中实现了它并在 google-groups 上讨论了它: 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(模拟 视频捕捉器)

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 的代码,它是来自的推送功能的实现 上面的代码。这里没什么奇怪的,我们使用 Capturer 来模拟 Capturer 的行为 委托。

 func push(videoFrame: RTCVideoFrame) 
        guard isConnected, videoCapturer != nil, isProcessed else 
            return
        
        videoSource.capturer(videoCapturer, didCapture: videoFrame)
    

现在您已准备好生成本地报价、发送和传输任何您想要的数据。尝试检查您的本地报价,如果您做的一切正确,您应该会在报价中看到 a=sendonly

附:按照VladimirTechMan的建议,您也可以在 AppRTCMobile 演示应用中查看广播扩展的示例代码。我为您找到了链接,它是 Objective-C 示例 https://webrtc.googlesource.com/src/+/358f2e076051d28b012529d3ae6a080838d27209 您应该对 ARDBroadcastSampleHandler.m/.h 和 ARDExternalSampleCapturer.m/.h 文件感兴趣。 千万不要忘记,你可以按照https://webrtc.org/native-code/ios/的指令自己搭建

【讨论】:

我试图让项目运行,但我无法从示例代码构建项目,我使用了你的 sn-ps,但它不能正常工作,或者我应该添加其他任何东西? @dmyma 您应该在广播扩展中设置用于通常 webRTC 调用的代码,但从中删除 deviceCapturer 部分并将该部分替换为函数 'func push(videoFrame: RTCVideoFrame)',因为在 broadcastExtension 你没有捕获设备。 @MaheshShahane:你能回答我的问题吗***.com/questions/61190672/… 我已经为此苦苦挣扎了好几个星期了。 您是否将 webrtc 框架导入到扩展中,或者以某种方式在框架中创建了扩展? 嘿@BwsSluk 你能在github上分享你的源代码吗?我面临着类似的问题。尝试将 webrtc 框架导入广播扩展似乎不起作用。不确定我是否做错了什么

以上是关于如何在广播上传扩展(iOS)中实现上传?的主要内容,如果未能解决你的问题,请参考以下文章

如何java中实现上传头像功能?

如何java中实现上传头像功能?

如何在 ASP.NET 中实现 Blueimp jQuery 文件上传

iOS 广播上传扩展、框架和应用程序之间的通信

在fragment中实现Android上传图片至本地JavaWeb服务器

如何在Python中实现argparse