Flutter数据转换插件nyx_converter的使用

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

Flutter数据转换插件nyx_converter的使用

Nyx Converter 介绍

nyx_converter 是一个用于Flutter应用中的数据转换插件,它利用强大的 ffmpeg 实现媒体文件在不同格式、编解码器、分辨率、比特率和音频属性之间的转换。这个插件为你的Flutter应用程序提供了便捷高效的媒体处理解决方案。

nyx_converter logo

主要功能

  • 广泛的容器支持:可以转换各种视频和音频文件容器。
  • 灵活的编解码器控制:指定所需的视频编解码器(例如H.264、VP8)和音频编解码器(例如AAC、MP3),以定制输出文件的特性。(即将添加)
  • 细致的分辨率管理:定义转换后视频的确切宽度和高度(以像素为单位),从而精确控制输出尺寸。(即将添加)
  • 比特率优化:设置比特率(以kbps为单位),在质量和文件大小之间取得平衡,满足不同的带宽要求或存储限制。(即将添加)
  • 音频微调:指定转换后媒体文件中音频流的采样频率(以Hz为单位)和声道数(单声道或立体声),允许自定义音频输出。(即将添加)

安装

要在项目中使用该插件,请在 pubspec.yaml 文件中添加 nyx_converter 作为依赖项:

dependencies:
  nyx_converter: <latest-version>

平台支持

下表显示了 nyx_converter 版本对 Android API 级别、iOS 部署目标和 macOS 部署目标的要求:

Android API Level iOS Minimum Deployment Target macOS Minimum Deployment Target
24 12.1 10.15

使用方法

导入

在Dart代码中导入包:

import 'package:nyx_converter/nyx_converter.dart';
示例代码

以下是一个完整的示例,展示了如何使用 nyx_converter 插件进行媒体文件转换:

import 'dart:io';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:nyx_converter/nyx_converter.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Nyx Converter Example App',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? inputFilePath;
  Directory? outputPath;
  NyxContainer? container;
  NyxVideoCodec? videoCodec;
  NyxAudioCodec? audioCodec;
  bool isLoading = false;
  bool isDone = false;
  bool isCanceled = false;

  @override
  Widget build(BuildContext context) {
    // 获取存储权限
    _getPermission();

    return Scaffold(
        appBar: AppBar(
          title: const Text('Nyx Converter Example App'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              // 选择文件按钮
              ElevatedButton(
                onPressed: () async {
                  final result = await FilePicker.platform.pickFiles();
                  if (result != null) {
                    setState(() {
                      inputFilePath = result.files.single.path;
                    });
                  }
                },
                child: const Text('Select File'),
              ),
              // 显示选定文件路径
              inputFilePath != null
                  ? Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
                      child: Text(inputFilePath!),
                    )
                  : Container(),
              // 保存到目录选择
              ElevatedButton(
                onPressed: () async {
                  final directory = await getDownloadsDirectory();
                  setState(() {
                    outputPath = directory;
                  });
                },
                child: const Text('Save To'),
              ),
              // 显示选定目录路径
              outputPath != null
                  ? Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
                      child: Text(outputPath!.path.toString()),
                    )
                  : Container(),
              // 转换按钮
              ElevatedButton(
                onPressed: () => _startConvert(inputFilePath, outputPath, container, videoCodec, audioCodec),
                child: const Text('Convert'),
              ),
              // 停止按钮
              ElevatedButton(
                onPressed: () => NyxConverter.kill(),
                child: const Text('Kill Process'),
              ),
              // 显示完成状态
              isDone == true
                  ? const Padding(
                      padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
                      child: Text('Done'),
                    )
                  : isCanceled == true
                      ? const Padding(
                          padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
                          child: Text('Canceled'),
                        )
                      : Container(),
            ],
          ),
        ));
  }

  _getPermission() async {
    var status = await Permission.storage.status;
    if (status.isDenied) {
      await Permission.storage.request();
    }
  }

  _showDialog(String message) {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: const Text("Error"),
        content: Text(message),
        backgroundColor: Colors.white,
        actions: <Widget>[
          TextButton.icon(
              onPressed: () async {
                Navigator.of(context).pop();
              },
              style: TextButton.styleFrom(
                  backgroundColor: Colors.grey[200],
                  foregroundColor: Colors.black),
              icon: const Icon(Icons.disabled_by_default_outlined),
              label: const Text('OK')),
        ],
      ),
    );
  }

  _startConvert(
      String? filePath,
      Directory? outputPath,
      NyxContainer? container,
      NyxVideoCodec? vCodec,
      NyxAudioCodec? aCodec) async {
    setState(() {
      isLoading = true;
    });
    _getPermission();

    Directory? output = outputPath ?? await getDownloadsDirectory();

    if (inputFilePath == null) {
      _showDialog('Please select input file');
      setState(() {
        isLoading = false;
      });
    }
    String rfilename = Random().nextInt(1000).toString();
    if (outputPath != null && inputFilePath != null) {
      await NyxConverter.convertTo(filePath!, output!.path,
          container: container ?? NyxContainer.mp4,
          videoCodec: vCodec ?? NyxVideoCodec.h264,
          audioCodec: aCodec ?? NyxAudioCodec.aac,
          fileName: rfilename,
          debugMode: true,
          execution: (String? path, NyxStatus status, {String? errorMessage}) {
        if (status == NyxStatus.failed) {
          setState(() {
            isLoading = false;
          });
          _showDialog(errorMessage ?? 'Something went wrong');
        } else if (status == NyxStatus.completed) {
          String psthn = "${output.path}/$rfilename.avi";

          print('*************$psthn');
          print('*************${File(psthn).existsSync()}');
          setState(() {
            isLoading = false;
            isDone = true;
          });
        } else if (status == NyxStatus.running) {
          setState(() {
            isLoading = true;
            isDone = false;
          });
        } else if (status == NyxStatus.cancel) {
          setState(() {
            isLoading = false;
            isDone = false;
            isCanceled = true;
          });
        } else {
          setState(() {
            isLoading = false;
            isDone = true;
          });
        }
      });
    }
  }
}

停止进程

使用 .kill 方法终止所有 nyx_converter 进程:

NyxConverter.kill();

更多关于Flutter数据转换插件nyx_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据转换插件nyx_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用nyx_converter插件进行数据转换的代码案例。nyx_converter是一个假设的数据转换插件,用于演示目的,实际中请确保插件名称和用法是存在的。如果nyx_converter是一个真实存在的插件,以下代码应当根据插件的实际API进行调整。

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

dependencies:
  flutter:
    sdk: flutter
  nyx_converter: ^latest_version  # 替换为实际版本号

然后,运行flutter pub get来安装依赖。

接下来,我们来看一个示例,展示如何使用nyx_converter进行数据转换。假设nyx_converter提供了从字符串到整数的转换功能。

主文件:main.dart

import 'package:flutter/material.dart';
import 'package:nyx_converter/nyx_converter.dart';  // 假设的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Nyx Converter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ConverterDemo(),
    );
  }
}

class ConverterDemo extends StatefulWidget {
  @override
  _ConverterDemoState createState() => _ConverterDemoState();
}

class _ConverterDemoState extends State<ConverterDemo> {
  final TextEditingController _controller = TextEditingController();
  String _convertedValue = '';

  void _convertData() {
    // 假设nyx_converter有一个方法叫stringToInt
    int? result = NyxConverter.stringToInt(_controller.text);
    setState(() {
      if (result != null) {
        _convertedValue = 'Converted Value: $result';
      } else {
        _convertedValue = 'Invalid input';
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Nyx Converter Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter a string number',
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _convertData,
              child: Text('Convert'),
            ),
            SizedBox(height: 20),
            Text(_convertedValue),
          ],
        ),
      ),
    );
  }
}

假设的nyx_converter插件文件:nyx_converter.dart

请注意,这个文件通常是由插件开发者提供的,这里只是为了完整性而展示一个假设的实现。

// 假设的nyx_converter.dart文件内容
library nyx_converter;

class NyxConverter {
  /// Converts a string to an integer if possible.
  static int? stringToInt(String input) {
    try {
      return int.parse(input);
    } catch (_) {
      return null;
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,用户可以输入一个字符串数字,然后点击按钮将其转换为整数。如果输入无效(比如包含非数字字符),则显示“Invalid input”。

请注意,由于nyx_converter是一个假设的插件,你需要根据实际插件的API文档来调整代码。如果nyx_converter实际上不存在,你可能需要寻找一个真实存在的数据转换插件,并参考其文档进行实现。

回到顶部