Flutter音频流播放插件audio_streamer_ohos的使用

Flutter音频流播放插件audio_streamer_ohos的使用

audio_streamer_ohos

pub package GitHub stars GitHub forks GitHub license GitHub issues

OpenHarmony 平台上用于播放 PCM 音频流的插件。

使用方法

dependencies:
  audio_streamer: 4.1.1
  audio_streamer_ohos: 0.0.2

更多细节请参考 audio_streamer

权限

在 OpenHarmony 项目的 module.json 文件中添加 ohos.permission.MICROPHONE 权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.MICROPHONE",
        "reason": "Microphone permission is required to record audio."
      }
    ]
  }
}

示例代码

以下是一个完整的示例代码,展示了如何使用 audio_streamer_ohos 插件来录制和播放音频流。

import 'dart:math';
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:audio_streamer/audio_streamer.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(new AudioStreamingApp());

class AudioStreamingApp extends StatefulWidget {
  [@override](/user/override)
  AudioStreamingAppState createState() => new AudioStreamingAppState();
}

class AudioStreamingAppState extends State<AudioStreamingApp> {
  int? sampleRate;
  bool isRecording = false;
  List<double> audio = [];
  List<double>? latestBuffer;
  double? recordingTime;
  StreamSubscription<List<double>>? audioSubscription;

  /// 检查麦克风权限是否已授予。
  Future<bool> checkPermission() async => await Permission.microphone.isGranted;

  /// 请求麦克风权限。
  Future<void> requestPermission() async => await Permission.microphone.request();

  /// 处理音频样本回调。
  void onAudio(List<double> buffer) async {
    audio.addAll(buffer);

    // 获取实际采样率,如果尚未知道的话。
    sampleRate ??= await AudioStreamer().actualSampleRate;
    recordingTime = audio.length / sampleRate!;

    setState(() => latestBuffer = buffer);
  }

  /// 错误处理回调。
  void handleError(Object error) {
    setState(() => isRecording = false);
    print(error);
  }

  /// 开始音频采样。
  void start() async {
    // 检查是否可以使用麦克风。
    if (!(await checkPermission())) {
      await requestPermission();
    }

    // 设置采样率(仅在 Android 上有效)。
    AudioStreamer().sampleRate = 22100;

    // 开始监听音频流。
    audioSubscription = AudioStreamer().audioStream.listen(onAudio, onError: handleError);

    setState(() => isRecording = true);
  }

  /// 停止音频采样。
  void stop() async {
    audioSubscription?.cancel();
    setState(() => isRecording = false);
  }

  [@override](/user/override)
  Widget build(BuildContext context) => MaterialApp(
        home: Scaffold(
          body: Center(
              child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                Container(
                    margin: EdgeInsets.all(25),
                    child: Column(children: [
                      Container(
                        child: Text(isRecording ? "Mic: ON" : "Mic: OFF",
                            style: TextStyle(fontSize: 25, color: Colors.blue)),
                        margin: EdgeInsets.only(top: 20),
                      ),
                      Text(''),
                      Text('Max amp: ${latestBuffer?.reduce(max)}'),
                      Text('Min amp: ${latestBuffer?.reduce(min)}'),
                      Text('${recordingTime?.toStringAsFixed(2)} seconds recorded.'),
                    ])),
              ])),
          floatingActionButton: FloatingActionButton(
            backgroundColor: isRecording ? Colors.red : Colors.green,
            child: isRecording ? Icon(Icons.stop) : Icon(Icons.mic),
            onPressed: isRecording ? stop : start,
          ),
        ),
      );
}

更多关于Flutter音频流播放插件audio_streamer_ohos的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频流播放插件audio_streamer_ohos的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


audio_streamer_ohos 是一个用于在 OpenHarmony(OHOS)平台上播放音频流的 Flutter 插件。以下是使用该插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  audio_streamer_ohos: ^0.0.1  # 请根据实际情况填写版本号

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

2. 导入插件

在你的 Dart 文件中导入 audio_streamer_ohos 插件:

import 'package:audio_streamer_ohos/audio_streamer_ohos.dart';

3. 初始化音频流

在需要播放音频的地方,初始化音频流:

AudioStreamer audioStreamer = AudioStreamer();

4. 播放音频

使用 play 方法播放音频流,传入音频流的 URL:

String audioUrl = "https://example.com/your-audio-file.mp3";
audioStreamer.play(audioUrl);

5. 暂停和恢复播放

你可以使用 pauseresume 方法来控制音频的播放状态:

audioStreamer.pause();  // 暂停播放
audioStreamer.resume(); // 恢复播放

6. 停止播放

使用 stop 方法停止播放:

audioStreamer.stop();

7. 释放资源

在不再需要播放器时,释放资源:

audioStreamer.release();

8. 处理播放状态

你可以监听播放状态的变化,例如播放完成、播放错误等:

audioStreamer.onPlayerStateChanged.listen((state) {
  if (state == PlayerState.completed) {
    print("播放完成");
  } else if (state == PlayerState.error) {
    print("播放错误");
  }
});

9. 音量控制

你可以使用 setVolume 方法来调整音量:

audioStreamer.setVolume(0.5);  // 设置音量为50%

10. 进度控制

你可以使用 seekTo 方法来跳转到指定时间点:

audioStreamer.seekTo(Duration(seconds: 30));  // 跳转到30秒

11. 获取当前播放位置

你可以使用 getCurrentPosition 方法来获取当前播放位置:

Duration position = await audioStreamer.getCurrentPosition();
print("当前播放位置: $position");

12. 获取音频总时长

你可以使用 getDuration 方法来获取音频的总时长:

Duration duration = await audioStreamer.getDuration();
print("音频总时长: $duration");

13. 处理错误

你可以监听错误事件来处理播放过程中可能出现的错误:

audioStreamer.onError.listen((error) {
  print("播放错误: $error");
});

示例代码

以下是一个简单的示例代码,展示了如何使用 audio_streamer_ohos 插件播放音频流:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioPlayerScreen(),
    );
  }
}

class AudioPlayerScreen extends StatefulWidget {
  [@override](/user/override)
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  AudioStreamer audioStreamer = AudioStreamer();
  String audioUrl = "https://example.com/your-audio-file.mp3";

  [@override](/user/override)
  void initState() {
    super.initState();
    audioStreamer.onPlayerStateChanged.listen((state) {
      if (state == PlayerState.completed) {
        print("播放完成");
      } else if (state == PlayerState.error) {
        print("播放错误");
      }
    });
  }

  [@override](/user/override)
  void dispose() {
    audioStreamer.release();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('音频流播放器'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => audioStreamer.play(audioUrl),
              child: Text('播放'),
            ),
            ElevatedButton(
              onPressed: () => audioStreamer.pause(),
              child: Text('暂停'),
            ),
            ElevatedButton(
              onPressed: () => audioStreamer.resume(),
              child: Text('恢复'),
            ),
            ElevatedButton(
              onPressed: () => audioStreamer.stop(),
              child: Text('停止'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部