149 lines
5.7 KiB
Swift
149 lines
5.7 KiB
Swift
import Flutter
|
|
import UIKit
|
|
|
|
class FLNativeViewFactory: NSObject, FlutterPlatformViewFactory {
|
|
private var messenger: FlutterBinaryMessenger
|
|
private var pipeline: String
|
|
|
|
init(messenger: FlutterBinaryMessenger, pipeline: String) {
|
|
self.messenger = messenger
|
|
self.pipeline = pipeline
|
|
super.init()
|
|
}
|
|
|
|
func create(
|
|
withFrame frame: CGRect,
|
|
viewIdentifier viewId: Int64,
|
|
arguments args: Any?
|
|
) -> FlutterPlatformView {
|
|
return FLNativeView(
|
|
frame: frame,
|
|
viewIdentifier: viewId,
|
|
arguments: args,
|
|
binaryMessenger: messenger,
|
|
pipeline: self.pipeline)
|
|
}
|
|
}
|
|
|
|
class FLNativeView: NSObject, FlutterPlatformView {
|
|
private var _view: UIView
|
|
//private var _pipeline: String = ""
|
|
private var _gStreamerBackend: GStreamerBackend
|
|
|
|
init(
|
|
frame: CGRect,
|
|
viewIdentifier viewId: Int64,
|
|
arguments args: Any?,
|
|
binaryMessenger messenger: FlutterBinaryMessenger?,
|
|
pipeline pipeline: String
|
|
) {
|
|
_view = UIView()
|
|
|
|
/*
|
|
print("[FLNativeView] viewId: " + String(viewId))
|
|
switch (viewId) {
|
|
case 0:
|
|
//_pipeline = "videotestsrc pattern=smpte ! warptv ! videoconvert ! autovideosink"
|
|
_pipeline = "rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 retry=60000 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.55.1:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.0.103:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
break
|
|
case 1:
|
|
//_pipeline = "videotestsrc pattern=circular ! warptv ! videoconvert ! autovideosink"
|
|
_pipeline = "rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 retry=60000 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.55.1:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.0.103:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
break
|
|
case 2:
|
|
//_pipeline = "videotestsrc pattern=checkers-8 ! warptv ! videoconvert ! autovideosink"
|
|
_pipeline = "rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 retry=60000 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.55.1:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.0.103:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
break
|
|
case 3:
|
|
//_pipeline = "videotestsrc pattern=smpte100 ! warptv ! videoconvert ! autovideosink"
|
|
_pipeline = "rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 retry=60000 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.55.1:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.0.103:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
break
|
|
default:
|
|
_pipeline = "rtspsrc location=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.55.1:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
//_pipeline = "rtspsrc location=rtsp://192.168.0.103:9000/sony latency=0 ! decodebin ! autovideosink"
|
|
break
|
|
}
|
|
*/
|
|
_gStreamerBackend = GStreamerBackend(
|
|
pipeline,
|
|
videoView: _view)
|
|
|
|
super.init()
|
|
// iOS views can be created here
|
|
//createNativeView(view: _view)
|
|
}
|
|
|
|
func view() -> UIView {
|
|
return _view
|
|
}
|
|
|
|
func createNativeView(view _view: UIView){
|
|
_view.backgroundColor = UIColor.blue
|
|
let nativeLabel = UILabel()
|
|
nativeLabel.text = "Native text from iOS: " + String("")
|
|
nativeLabel.textColor = UIColor.white
|
|
nativeLabel.textAlignment = .center
|
|
nativeLabel.frame = CGRect(x: 0, y: 0, width: 180, height: 48.0)
|
|
_view.addSubview(nativeLabel)
|
|
}
|
|
}
|
|
|
|
public class SwiftFlutterGstreamerPlayerPlugin: NSObject, FlutterPlugin {
|
|
|
|
static var registrar: FlutterPluginRegistrar? = nil;
|
|
/* static var factory: FLNativeViewFactory? = nil; */
|
|
|
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
|
let channel = FlutterMethodChannel(name: "flutter_gstreamer_player", binaryMessenger: registrar.messenger())
|
|
let instance = SwiftFlutterGstreamerPlayerPlugin()
|
|
registrar.addMethodCallDelegate(instance, channel: channel)
|
|
|
|
gst_ios_init()
|
|
|
|
SwiftFlutterGstreamerPlayerPlugin.registrar = registrar
|
|
/* SwiftFlutterGstreamerPlayerPlugin.factory = factory */
|
|
}
|
|
|
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
|
switch (call.method) {
|
|
case "getPlatformVersion":
|
|
result("iOS " + UIDevice.current.systemVersion)
|
|
break
|
|
case "PlayerRegisterTexture":
|
|
guard let args = call.arguments as? [String : Any] else {
|
|
result(" arguments error.... ")
|
|
return
|
|
}
|
|
let pipeline = args["pipeline"] as! String;
|
|
let playerId = args["playerId"] as! Int64;
|
|
|
|
/* guard let factory = SwiftFlutterGstreamerPlayerPlugin.factory as? FLNativeViewFactory else { */
|
|
/* print("Internal plugin error: factory does not initialized") */
|
|
/* return */
|
|
/* } */
|
|
guard let registrar = SwiftFlutterGstreamerPlayerPlugin.registrar as? FlutterPluginRegistrar else {
|
|
print("Internal plugin error: registrar does not initialized")
|
|
return
|
|
}
|
|
|
|
var factory = FLNativeViewFactory(messenger: registrar.messenger(), pipeline: pipeline)
|
|
registrar.register(factory, withId: String(playerId))
|
|
|
|
result(playerId)
|
|
break
|
|
default:
|
|
result(FlutterMethodNotImplemented)
|
|
break
|
|
}
|
|
}
|
|
}
|