support flutter gstreamer player for iOS
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user