背景介绍:
前端时间基于公司项目需求,需要在flutter中播放海康的 iSecure Center 平台视频监控画面,在网上找寻了好久,发现没有合适的视频播放插件,咨询海康官方也没有提供flutter版支持,所以内部封装了一下native端的SDK,开发了一个基于海康isc平台SDK的flutter版插件,并发布到 https://pub.dev/ 有需要的童鞋可以自行使用;
iscflutterplugin使用:
插件使用起来比较简单,可以直接参考demo,插件中注释写的非常详细,同时,大家如果有使用上的问题,可以加QQ群 856941179 进行交流.
引入依赖:
在pubspec.yaml文件中增加依赖:
dependencies:
iscflutterplugin: ^1.0.3
运行命令获取依赖:
flutter pub get
在Dart代码中导包:
import 'package:iscflutterplugin/iscflutterplugin.dart';
example:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:iscflutterplugin/isc_http.dart';
import 'package:iscflutterplugin/isc_player.dart';
import 'package:iscflutterplugin/iscflutterplugin.dart';
import 'package:path_provider/path_provider.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> {
Iscflutterplugin _controller;
String _previewUrl;
var cameraCode = 'xxx';
@override
void initState() {
super.initState();
//初始化配置
ArtemisConfig.host = "xxx";
ArtemisConfig.appKey = "xxx";
ArtemisConfig.appSecret = "xxx";
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('海康isc播放器插件,支持android/ios'),
),
body: Column(
children: <Widget>[
Container(
width: 500,
height: 300,
color: Colors.black,
child: IscPlayerWidget(
onCreated: _onCreated,
),
),
Expanded(
child: SingleChildScrollView(
child: Container(
width: double.infinity,
child: Column(
children: <Widget>[
RaisedButton(child: Text("预览"), onPressed: _preview),
RaisedButton(
child: Text("码流平滑切换(仅支持Android)"),
onPressed: _changeStream),
RaisedButton(
child: Text("抓拍(需存储权限)"), onPressed: _capture),
RaisedButton(
child: Text(
_isRecording ? "结束录像(需存储权限)" : "开始录像(需存储权限)"),
onPressed: _record),
RaisedButton(child: Text("云台"), onPressed: _ptzs),
],
),
),
),
)
],
),
),
);
}
void _onCreated(controller) {
_controller = controller;
}
void _changeStream() async {
var ret = await _controller.changeStream(_previewUrl);
print('码流切换 : $ret');
}
///云台控制
void _ptzs() async {
//开始云台控制
var ret = await IscApi.ptzControl(cameraCode, 0, 'ZOOM_OUT');
print('开始云台控制 : $ret');
sleep(Duration(milliseconds: 100));
//停止云台控制
var ret1 = await IscApi.ptzControl(cameraCode, 1, 'ZOOM_OUT');
print('停止云台控制 : $ret1');
}
var _isRecording = false;
///录像
void _record() async {
//申请权限
_requestPermission();
//图片保存路径
String path =
'${(await getExternalStorageDirectory()).path}/${DateTime.now().toString()}.mp4';
print('path = $path');
if (_isRecording) {
var ret = await _controller.stopRecord();
if (ret['ret']) {
_isRecording = false;
}
print('结束录像 : $ret');
} else {
var ret = await _controller.startRecord(path);
if (ret['ret']) {
_isRecording = true;
}
print('开始录像 : $ret');
}
setState(() {});
}
///抓拍
void _capture() async {
//申请权限
_requestPermission();
//图片保存路径
String path =
'${(await getExternalStorageDirectory()).path}/${DateTime.now().toString()}.jpg';
print('path = $path');
//抓拍
var ret = await _controller.capturePicture(path);
print('抓拍 : $ret');
}
///预览
void _preview() async {
//获取预览地址
Map ret = await IscApi.getPreviewURL(cameraIndexCode: cameraCode);
_previewUrl = ret['data']['url'];
print('预览地址 = $_previewUrl');
//设置播放器状态回调
_controller.setStatusCallback((status) {
print('播放器状态 = ${_controller.getStatusMessage(status)}');
});
//开始预览
_controller.startRealPlay(_previewUrl);
}
///申请权限
void _requestPermission() async {
if (await Permission.storage.request().isGranted) {
print('已授权');
}
}
}
网友评论