2

我正在使用 SwiftUI 流式传输 RTSPVLCMediaPlayer

这是我的播放器代码:

import Foundation
import MobileVLCKit
import SwiftUI

struct VlcPlayerRepresentable: UIViewRepresentable{ //MARK: Transform from a UIView into swiftUI compatible
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<VlcPlayerRepresentable>) {
}

func makeUIView(context: Context) -> UIView {
    return PlayerUIView(frame: .zero)
}}

class PlayerUIView: UIView, VLCMediaPlayerDelegate,ObservableObject{
let mediaPlayer : VLCMediaPlayer = VLCMediaPlayer()// You can also add options in here
override init(frame: CGRect) {
    super.init(frame: UIScreen.screens[0].bounds)
    let url = URL(string: "rtsps://stream-eu1-bravo.dropcam.com:443/sdm_live_stream/")!//replace your resource here

    let media = VLCMedia(url: url)

    media.addOptions([// Add options here
        "network-caching": 300,
        "--rtsp-frame-buffer-size":100,
        "--vout": "ios",
        "--glconv" : "glconv_cvpx",
        "--rtsp-caching=": 150,
        "--tcp-caching=": 150,
        "--realrtsp-caching=": 150,
        "--h264-fps": 20.0,
        "--mms-timeout": 60000
    ])

    mediaPlayer.media = media
    mediaPlayer.delegate = self
    mediaPlayer.drawable = self
    mediaPlayer.audio.isMuted = true

    mediaPlayer.videoAspectRatio = UnsafeMutablePointer<Int8>(mutating: ("16:9" as NSString).utf8String)
    mediaPlayer.play()}
    
    func checkConnection() -> Bool{
        let isPlaying: Bool = mediaPlayer.isPlaying
        return isPlaying
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

struct StreamsTab: View {
var body: some View {
    return VStack{
        Text("stream")
        VlcPlayerRepresentable()
    }
}}

这适用于以下 URL:rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4

但是,当使用从 Google API GenerateRTSPStream ( https://developers.google.com/nest/device-access/use-the-api#camera ) 生成的 URL 时,它看起来像:"rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken"来自 api 调用的完整响应:

{
  "results" : {
    "streamUrls" : {
      "rtspUrl" : "rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken"
    },
    "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...",
    "streamToken" : "g.0.streamingToken",
    "expiresAt" : "2018-01-04T18:30:00.000Z"
  }
}

流不加载。问题是它使用 RTSPS 的事实吗?如果是这样,我如何调整我的代码以流式传输 RTSPS?如果这不是问题,那是什么?很卡在这里。

编辑:似乎 VLCMediaPlayer 不支持 RTSPS,如何在 iOS 中流式传输 RTSPS?

4

1 回答 1

0

那里没有很多 RTSPS 播放器,ffmpeg 中的 ffplay 应该可以处理它。

于 2022-01-07T22:12:54.887 回答