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

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

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

Icecast Flutter 插件 📻

一个用于将音频流传输到Icecast服务器的Flutter插件。该插件允许用户从输入设备捕获音频,传输到Icecast,并通过方法通道与原生平台代码进行通信。

特性

  • 将音频流传输到Icecast服务器。
  • 支持写入原始音频数据到流。
  • 启动/停止流式传输,可自定义设置如比特率、声道数、采样率等。

安装

要使用此插件,在你的pubspec.yaml文件中添加icecast_flutter作为依赖项:

运行以下命令以获取插件:

flutter pub get

使用

导入库

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

import 'package:icecast_flutter/icecast_flutter.dart';

初始化

使用startStream方法开始向Icecast服务器传输音频流。你可以通过提供比特率、采样率、声道数以及Icecast服务器凭据等详细信息来配置流。

_icecastFlutterPlugin = IcecastFlutter(
    password: password,
    userName: username,
    serverAddress: serverAddress,
    mount: mount,
    port: serverPort,
    bitrate: bitRate,
    sampleRate: sampleRate,
    numChannels: numChannels,
    onError: (error) {
      print("Streaming Error: $error");
    },
    onComplete: () {
      print("Streaming Completed 🟢");
    },
);

开始流式传输

void startIcecastStream() async {
  await _icecastFlutterPlugin.startStream(outputStream.stream);
}

停止流式传输

要停止正在进行的音频流:

void stopIcecastStream() async {
  await _icecastFlutterPlugin.stopStream();
}

写入音频数据到流

// 写入流管道
outputStream.add(yourPcmByteArray);

平台支持

  • Android: 支持
  • iOS: 即将推出

完整示例

以下是一个完整的示例代码,演示了如何使用icecast_flutter插件进行音频流传输。

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:icecast_flutter/icecast_flutter.dart';
import 'package:record/record.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isStreaming = false;
  late AudioRecorder record;
  late StreamController<List<int>> outputStream;
  late final IcecastFlutter _icecastFlutterPlugin;
  final int bitRate = 128;
  final int sampleRate = 44100;
  final int numChannels = 2;

  [@override](/user/override)
  void initState() {
    record = AudioRecorder();

    _icecastFlutterPlugin = IcecastFlutter(
      password: "your_password",
      userName: "your_username",
      serverAddress: "your_server_address",
      mount: "your_mount_point",
      port: 8000,
      bitrate: bitRate,
      sampleRate: sampleRate,
      numChannels: numChannels,
      onError: (error) {
        print("Streaming Error: $error");
      },
      onComplete: () {
        print("Streaming Completed 🟢");
      },
    );
    super.initState();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: ElevatedButton(
              onPressed: () async {
                if (!isStreaming) {
                  outputStream = StreamController.broadcast();

                  await _icecastFlutterPlugin.startStream(
                    outputStream.stream,
                  );

                  startStreaming();

                  setState(() {
                    isStreaming = true;
                  });
                } else {
                  var response = await _icecastFlutterPlugin.stopStream();
                  if (response == null) {
                    stopStream();
                  } else {
                    debugPrint("Stop Error: $response");
                  }

                  setState(() {
                    isStreaming = false;
                  });
                }
              },
              child: Text(isStreaming ? '停止流式传输' : '开始流式传输')),
        ),
      ),
    );
  }

  void startStreaming() async {
    List<int> byteBuffer = [];
    final bufferSize = ((sampleRate * 16 * numChannels) ~/ 8).toInt();

    var stream = await record.startStream(
      RecordConfig(
        encoder: AudioEncoder.pcm16bits,
        bitRate: bitRate,
        numChannels: numChannels,
        sampleRate: sampleRate,
        noiseSuppress: true,
        echoCancel: true,
      ),
    );

    stream.listen((Uint8List bytes) {
      if (!isStreaming) return;

      try {
        List<int> pcm16Chunk = AudioRecorder().convertBytesToInt16(bytes);
        byteBuffer.addAll(pcm16Chunk);
        if (byteBuffer.length >= bufferSize) {
          var currentChunk = byteBuffer.sublist(0, bufferSize);
          // 更新缓冲区
          byteBuffer = byteBuffer.sublist(bufferSize, byteBuffer.length);

          outputStream.add(currentChunk);
          // debugPrint("Audio Chunk $currentChunk");

          // debugPrint("Chunk 1 $chunk1");
        }
      } catch (e) {
        List<int> silenceChunk = IcecastFlutter.generateSilentBytes(1, 44100, 2);
        outputStream.add(silenceChunk);

        debugPrint('Streaming error: $e');
      }
    });
  }

  void stopStream() {
    outputStream.close();
    record.stop();
  }
}

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

1 回复

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


icecast_flutter 是一个用于在 Flutter 应用中播放 Icecast 音频流的插件。Icecast 是一种流媒体服务器协议,常用于广播电台和音频流媒体服务。通过 icecast_flutter,你可以轻松地在 Flutter 应用中集成 Icecast 音频流播放功能。

以下是如何使用 icecast_flutter 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  icecast_flutter: ^0.0.1  # 请检查最新版本

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

2. 导入插件

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

import 'package:icecast_flutter/icecast_flutter.dart';

3. 初始化并播放音频流

你可以使用 IcecastPlayer 类来播放 Icecast 音频流。以下是一个简单的示例:

class AudioPlayerScreen extends StatefulWidget {
  @override
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  IcecastPlayer? _player;

  @override
  void initState() {
    super.initState();
    _player = IcecastPlayer();
  }

  @override
  void dispose() {
    _player?.dispose();
    super.dispose();
  }

  void _playAudio() async {
    String streamUrl = 'https://example.com/your-icecast-stream'; // 替换为你的 Icecast 流 URL
    await _player?.play(streamUrl);
  }

  void _pauseAudio() async {
    await _player?.pause();
  }

  void _stopAudio() async {
    await _player?.stop();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Icecast Audio Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _playAudio,
              child: Text('Play'),
            ),
            ElevatedButton(
              onPressed: _pauseAudio,
              child: Text('Pause'),
            ),
            ElevatedButton(
              onPressed: _stopAudio,
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 处理播放状态

你可以通过监听 IcecastPlayer 的状态来更新 UI 或执行其他操作。例如:

_player?.onPlayerStateChanged.listen((state) {
  print('Player state: $state');
  // 根据状态更新 UI
});

5. 处理错误

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

_player?.onPlayerError.listen((error) {
  print('Player error: $error');
  // 处理错误
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!