andrew_video_sdk 0.0.2
andrew_video_sdk: ^0.0.2 copied to clipboard
Video editing SDK for Flutter — timeline, multi-track, transitions, effects, filters, AI subtitle, smart cut, screen recording. Layer 1 core with SPI architecture.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:andrew_video_sdk/andrew_video_sdk.dart';
/// video_sdk 最小使用示例:初始化 → 新建项目 → 预览 → 导出。
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Video SDK Demo',
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final _editor = VideoEditor();
final _logs = <String>[];
bool _initialized = false;
bool _hasProject = false;
int? _previewTextureId;
void _log(String s) {
setState(() {
_logs.insert(0, '${DateTime.now().toIso8601String().substring(11, 19)} $s');
});
}
Future<void> _ensureInit() async {
if (_initialized) return;
_log('init editor...');
await _editor.init(const VideoSdkConfig(
enableGpu: true,
enableProxy: true,
));
setState(() => _initialized = true);
_log('init done');
}
Future<void> _newProject() async {
await _ensureInit();
_log('new project...');
_editor.projectManager.newProject(name: 'demo');
setState(() => _hasProject = true);
_log('project created');
}
Future<void> _startPreview() async {
if (!_hasProject) {
_log('create project first');
return;
}
_log('start preview...');
_previewTextureId = await _editor.renderEngine.createPreviewTexture();
await _editor.renderEngine.startPreview(fps: 30, quality: 'adaptive');
setState(() {});
_log('previewing, textureId=$_previewTextureId');
}
Future<void> _export() async {
if (!_hasProject) {
_log('create project first');
return;
}
_log('export...');
await _editor.exportManager.export(
const ExportConfig(
width: 1080,
height: 1920,
fps: 30,
videoBitrate: 5000,
videoCodec: VideoCodec.h264,
format: ExportFormat.mp4,
),
onProgress: (p) => _log('export: ${(p * 100).toInt()}%'),
);
_log('export completed');
}
@override
void dispose() {
_editor.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Video SDK Demo')),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8),
child: Wrap(
spacing: 8,
children: [
ElevatedButton(
onPressed: _newProject,
child: const Text('New Project'),
),
ElevatedButton(
onPressed: _previewTextureId == null ? _startPreview : null,
child: const Text('Preview'),
),
ElevatedButton(
onPressed: _hasProject ? _export : null,
child: const Text('Export'),
),
],
),
),
if (_previewTextureId != null)
SizedBox(
height: 240,
child: Texture(textureId: _previewTextureId!),
),
const Divider(),
Expanded(
child: ListView.builder(
itemCount: _logs.length,
itemBuilder: (_, i) => ListTile(
dense: true,
title: Text(_logs[i], style: const TextStyle(fontSize: 12)),
),
),
),
],
),
);
}
}