Flutter功能扩展插件haishin_kit的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter功能扩展插件haishin_kit的使用

HaishinKit Plugin

pub package

HaishinKit是一个用于iOS和Android的Flutter插件,提供通过RTMP协议进行摄像头和麦克风流媒体传输的功能。

支持平台

平台 版本要求
Android SDK 21+
iOS iOS 12.0+

依赖项目

项目名称 备注 许可证
HaishinKit for iOS, macOS and tvOS 通过RTMP, HLS为iOS, macOS和tvOS提供的摄像头和麦克风流媒体库。 BSD 3-Clause “New” or “Revised” License
HaishinKit for Android 通过RTMP为Android提供的摄像头和麦克风流媒体库。 BSD 3-Clause “New” or “Revised” License

功能特性

  • RTMP
    • ✅ 认证
    • ✅ 发布与录制 (H264/AAC)
    • 回放 (Beta)
    • ✅ 自适应比特率流媒体传输
      • ✅ 自动丢帧
    • ❌ Action Message Format
      • ✅ AMF0
      • ❌ AMF3
    • ✅ SharedObject
    • ✅ RTMPS
      • ✅ 原生 (RTMP over SSL/TLS)

示例代码

以下是一个简单的Flutter应用程序示例,展示了如何使用haishin_kit插件来显示摄像头预览,并实现基本的RTMP流媒体发布功能。

import 'dart:async';

import 'package:audio_session/audio_session.dart';
import 'package:flutter/material.dart';
import 'package:haishin_kit/audio_source.dart';
import 'package:haishin_kit/net_stream_drawable_texture.dart';
import 'package:haishin_kit/rtmp_connection.dart';
import 'package:haishin_kit/rtmp_stream.dart';
import 'package:haishin_kit/video_source.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  RtmpConnection? _connection;
  RtmpStream? _stream;
  bool _recording = false;
  CameraPosition currentPosition = CameraPosition.back;

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    await Permission.camera.request();
    await Permission.microphone.request();

    // Set up AVAudioSession for iOS.
    final session = await AudioSession.instance;
    await session.configure(const AudioSessionConfiguration(
      avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
      avAudioSessionCategoryOptions:
          AVAudioSessionCategoryOptions.allowBluetooth,
    ));

    RtmpConnection connection = await RtmpConnection.create();
    connection.eventChannel.receiveBroadcastStream().listen((event) {
      switch (event["data"]["code"]) {
        case 'NetConnection.Connect.Success':
          _stream?.publish("live");
          setState(() {
            _recording = true;
          });
          break;
      }
    });

    RtmpStream stream = await RtmpStream.create(connection);
    stream.attachAudio(AudioSource());
    stream.attachVideo(VideoSource(position: currentPosition));

    if (!mounted) return;

    setState(() {
      _connection = connection;
      _stream = stream;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('HaishinKit example app'), actions: [
          IconButton(
            icon: const Icon(Icons.flip_camera_android),
            onPressed: () {
              if (currentPosition == CameraPosition.front) {
                currentPosition = CameraPosition.back;
              } else {
                currentPosition = CameraPosition.front;
              }
              _stream?.attachVideo(VideoSource(position: currentPosition));
            },
          )
        ]),
        body: Center(
          child: _stream == null
              ? const Text("")
              : NetStreamDrawableTexture(_stream),
        ),
        floatingActionButton: FloatingActionButton(
          child: _recording
              ? const Icon(Icons.fiber_smart_record)
              : const Icon(Icons.not_started),
          onPressed: () {
            if (_recording) {
              _connection?.close();
              setState(() {
                _recording = false;
              });
            } else {
              _connection?.connect("rtmp://192.168.1.9/live");
            }
          },
        ),
      ),
    );
  }
}

使用说明

  1. 初始化权限:在应用启动时请求相机和麦克风权限。
  2. 配置音频会话:对于iOS设备,设置AVAudioSession以确保音频输入输出正常工作。
  3. 创建连接:实例化RtmpConnection对象并监听连接事件。
  4. 创建流:创建RtmpStream对象并将其与音频源和视频源关联。
  5. 切换摄像头:通过点击图标按钮切换前后摄像头。
  6. 控制流状态:通过浮动按钮控制流媒体的开始和停止。

这个例子演示了如何使用haishin_kit插件来创建一个简单的直播应用,包括摄像头预览、流媒体发布等功能。根据实际需求,您可以进一步扩展此代码以添加更多功能或优化用户体验。


更多关于Flutter功能扩展插件haishin_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能扩展插件haishin_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,haishin_kit 是一个功能丰富的 Flutter 插件集合,它提供了多种实用的功能来扩展你的 Flutter 应用。下面是一些关于如何使用 haishin_kit 中一些常用功能的代码示例。

首先,你需要在你的 pubspec.yaml 文件中添加 haishin_kit 依赖:

dependencies:
  flutter:
    sdk: flutter
  haishin_kit: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

示例 1:使用 HaishinKitImagePicker 进行图片选择

HaishinKitImagePicker 是一个用于选择图片或视频的组件。

import 'package:flutter/material.dart';
import 'package:haishin_kit/haishin_kit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImagePickerScreen(),
    );
  }
}

class ImagePickerScreen extends StatefulWidget {
  @override
  _ImagePickerScreenState createState() => _ImagePickerScreenState();
}

class _ImagePickerScreenState extends State<ImagePickerScreen> {
  File? _imageFile;

  Future<void> _pickImage() async {
    final result = await HaishinKitImagePicker.pickImage(
      sourceType: ImageSourceType.gallery,  // 或者 ImageSourceType.camera
    );
    if (result != null && result.path != null) {
      setState(() {
        _imageFile = File(result.path!);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: _imageFile == null
            ? Text('No image selected.')
            : Image.file(_imageFile!),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _pickImage,
        tooltip: 'Pick Image',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

示例 2:使用 HaishinKitQRCodeScanner 进行二维码扫描

HaishinKitQRCodeScanner 是一个用于扫描二维码的组件。

import 'package:flutter/material.dart';
import 'package:haishin_kit/haishin_kit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: QRCodeScannerScreen(),
    );
  }
}

class QRCodeScannerScreen extends StatefulWidget {
  @override
  _QRCodeScannerScreenState createState() => _QRCodeScannerScreenState();
}

class _QRCodeScannerScreenState extends State<QRCodeScannerScreen> {
  String? _result;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              flex: 2,
              child: HaishinKitQRCodeScanner(
                onScan: (result) {
                  setState(() {
                    _result = result;
                  });
                },
              ),
            ),
            Expanded(
              flex: 1,
              child: Text(
                _result ?? 'Scan a QR code',
                style: TextStyle(fontSize: 24),
                textAlign: TextAlign.center,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

示例 3:使用 HaishinKitShare 进行内容分享

HaishinKitShare 提供了方便的分享功能。

import 'package:flutter/material.dart';
import 'package:haishin_kit/haishin_kit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ShareScreen(),
    );
  }
}

class ShareScreen extends StatelessWidget {
  void _share() {
    final RenderBox box = context.findRenderObject();
    Share.share(
      'Check out this cool Flutter app!',
      sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size,
      shareImage: NetworkImage('https://flutter.dev/assets/images/flutter-logo-sharing.png'),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Share Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _share,
          child: Text('Share'),
        ),
      ),
    );
  }
}

请注意,以上代码仅展示了 haishin_kit 插件中的部分功能。根据实际需求,你可以查阅 haishin_kit 的官方文档获取更多详细信息和高级用法。

回到顶部