node_media_client_plugin 0.0.1 copy "node_media_client_plugin: ^0.0.1" to clipboard
node_media_client_plugin: ^0.0.1 copied to clipboard

A new Flutter plugin.

example/lib/main.dart

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),
                ),
              ),
            ],
          )),
    );
  }
}
0
likes
20
pub points
0%
popularity

Publisher

unverified uploader

A new Flutter plugin.

Homepage

License

unknown (LICENSE)

Dependencies

flutter

More

Packages that depend on node_media_client_plugin