node_media_client_plugin 0.0.1 node_media_client_plugin: ^0.0.1 copied to clipboard
A new Flutter plugin.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:node_media_client_plugin/node_media_client_engine.dart';
import 'package:node_media_client_plugin/node_media_platform_view_utils.dart';
import 'package:node_media_client_plugin/node_media_defines.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp( MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
static const double viewRatio = 3.0/4.0;
GlobalKey _playViewContainerKey = GlobalKey();
GlobalKey _previewViewContainerKey = GlobalKey();
Widget _previewViewWidget;
Widget _playViewWidget;
int _previewViewID;
int _playViewID;
String url = "rtmp://10.10.1.10:1935/live/test1?sign=2156123647-b78e80158ed93528c30049b644f01848";
NDPublisherState _publisherState = NDPublisherState.NoPublish;
NDPlayerState _playerState = NDPlayerState.NoPlay;
bool _isCameraPermissionGranted = false;
bool _isMicrophonePermissionGranted = false;
@override
void initState() {
super.initState();
this.createEngine();
Permission.camera.status.then((value) => setState(
() => _isCameraPermissionGranted = value == PermissionStatus.granted));
Permission.microphone.status.then((value) => setState(() =>
_isMicrophonePermissionGranted = value == PermissionStatus.granted));
setEventCallback();
}
void destroyEngine() async {
NodeMediaClientEngine.destroyEngine();
print('π³οΈ Destroy NodeMediaClientEngine');
clearEventCallback();
// Notify View that engine state changed
setState(() {
_publisherState = NDPublisherState.NoPublish;
});
}
void setEventCallback() {
NodeMediaClientEngine.onEventCallback = (int event, String msg) {
print('π© πͺ onEventCallback, event: $event, msg: $msg');
};
}
void clearEventCallback() {
NodeMediaClientEngine.onEventCallback = null;
}
void createEngine() {
NodeMediaClientEngine.createEngine();
// Notify View that engine state changed
print('π Create NodeMediaClientEngine');
}
Future<void> requestCameraPermission() async {
PermissionStatus cameraStatus = await Permission.camera.request();
setState(() => _isCameraPermissionGranted = cameraStatus.isGranted);
}
Future<void> requestMicrophonePermission() async {
PermissionStatus microphoneStatus = await Permission.microphone.request();
setState(() => _isMicrophonePermissionGranted = microphoneStatus.isGranted);
}
void startPublishingStream(String url) {
void _startPreview(int viewID) {
NDCanvas canvas = NDCanvas.view(viewID);
NodeMediaClientEngine.instance.startPreview(canvas: canvas);
print('π Start preview, viewID: $viewID');
}
void _startPublishingStream(String url) {
NodeMediaClientEngine.instance.startPublishingStream(url);
print('π€ Start publishing stream, url: $url');
}
if(_previewViewWidget == null){
setState(() {
_previewViewWidget =
NodeMediaClientEngine.instance.createPlatformView((viewID) {
_previewViewID = viewID;
_startPreview(_previewViewID);
_startPublishingStream(url);
});
});
}else{
// _startPreview(_previewViewID);
_startPublishingStream(url);
}
// TODO ζζΆθΏδΉε
setState(() => _publisherState = NDPublisherState.Publishing);
}
void stopPublishingStream() {
NodeMediaClientEngine.instance.stopPublishingStream();
// NodeMediaClientEngine.instance.stopPreview();
setState(() {
_publisherState = NDPublisherState.NoPublish;
});
}
void startPlayingStream(String url, {double width = 360, double height = 640}) {
void _startPlayingStream(int viewID) {
NDCanvas canvas = NDCanvas.view(viewID);
NodeMediaClientEngine.instance.startPlayingStream(url, canvas: canvas);
print('π₯ Start playing stream, viewID: $viewID');
}
if(_playViewWidget == null){
setState(() {
_playViewWidget = NodeMediaClientEngine.instance.createPlatformView((viewID) {
_playViewID = viewID;
_startPlayingStream(viewID);
});
});
}else{
_startPlayingStream(_playViewID);
}
// TODO ζζΆθΏδΉε
setState(() => _playerState = NDPlayerState.Playing);
}
void stopPlayingStream() {
NodeMediaClientEngine.instance.stopPlayingStream();
setState(() => _playerState = NDPlayerState.NoPlay);
}
Widget viewsWidget() {
return Container(
height: 300,
child: GridView(
padding: const EdgeInsets.all(10.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: viewRatio,
),
children: [
Stack(children: [
Container(
color: Colors.grey,
child: _previewViewWidget,
key: _previewViewContainerKey,
),
Text('Local Preview View', style: TextStyle(color: Colors.white))
], alignment: AlignmentDirectional.topCenter),
Stack(children: [
Container(
color: Colors.grey,
child: _playViewWidget,
key: _playViewContainerKey,
),
Text('Remote Play View', style: TextStyle(color: Colors.white))
], alignment: AlignmentDirectional.topCenter),
],
),
);
}
Widget checkPermissionWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(padding: const EdgeInsets.only(top: 20.0)),
Text("Permission status: (Press icon to request)"),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
IconButton(
icon: _isCameraPermissionGranted
? Icon(Icons.camera_alt)
: Icon(Icons.camera_alt_outlined),
iconSize: 50.0,
onPressed: requestCameraPermission),
Text(_isCameraPermissionGranted ? 'β
' : 'βοΈ')
],
),
SizedBox(width: 50),
Row(
children: [
IconButton(
icon: _isMicrophonePermissionGranted
? Icon(Icons.mic)
: Icon(Icons.mic_none),
iconSize: 50.0,
onPressed: requestMicrophonePermission),
Text(_isMicrophonePermissionGranted ? 'β
' : 'βοΈ')
],
)
],
),
],
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example ap11p'),
),
body: Column(
children: [
viewsWidget(),
checkPermissionWidget(),
Container(
width: 200,
child: CupertinoButton.filled(
child: Text(
_publisherState == NDPublisherState.NoPublish
? 'β
StartPublishing'
: 'StopPublishing',
style: TextStyle(fontSize: 14.0),
),
onPressed: _publisherState == NDPublisherState.NoPublish
? () {
startPublishingStream(url);
}
: () {
stopPublishingStream();
},
padding: EdgeInsets.all(10.0),
),
),
Container(
width: 200,
padding: EdgeInsets.only(top: 20),
child: CupertinoButton.filled(
child: Text(
_playerState == NDPlayerState.NoPlay ? 'β
StartPlaying' : 'StopPlaying',
style: TextStyle(fontSize: 14.0),
),
onPressed: _playerState == NDPlayerState.NoPlay
? () {
startPlayingStream(url);
}
: () {
stopPlayingStream();
},
padding: EdgeInsets.all(10.0),
),
),
],
)),
);
}
}