Flutter Icecast流媒体播放插件icecast的使用

Flutter Icecast流媒体播放插件icecast的使用

Icecast 是一个用于处理 Icecast 流媒体的 Dart 库。

示例

运行以下命令以运行示例控制台应用程序:

dart run example/icecast_example.dart

功能/路线图

  • ✅ 打开 Icecast 流
  • ❌ 解析元数据
  • ❌ 播放音频流
  • ❌ 测试
    • ❌ 单元测试
    • ❌ 集成测试
  • ❌ 跨平台测试
    • ❌ Linux
    • ❌ MacOS
    • ❌ Windows
    • ❌ Web
    • ❌ Android
    • ❌ iOS
    • ❌ watchOS
    • ❌ tvOS
    • ❌ WearOS
    • ❌ Roku
  • ❌ 录制音频流
  • ❌ 传输音频流
  • ❌ 带有元数据的音频流
  • ❌ 带有元数据和录制功能的音频流

优先级较低的任务

  • ❌ CONTRIBUTING
  • ❌ CODE_OF_CONDUCT
  • ❌ LICENSE
  • ❌ README
  • ❌ CHANGELOG
  • ❌ PULL_REQUEST_TEMPLATE
  • ❌ ISSUE_TEMPLATE
  • ❌ SECURITY
  • ❌ SUPPORT
  • ❌ VERSION
  • ❊ AUTHORS
  • ❊ ROADMAP

完整示例代码

import 'dart:io';

import 'package:console/console.dart';
import 'package:icecast/src/stream.dart';

void main() async {
  // 创建一个 Icecast 流实例,并指定流的 URL 和资源名称。
  var icecastStream = Stream(
    url: "stream.rekt.network", // Icecast 服务器的 URL
    resource: "datawave.ogg", // 资源文件名
  );

  // 连接到 Icecast 流并获取订阅对象。
  var subscription = await icecastStream.connect();

  // 等待解析头部信息后再打印。
  await Future.delayed(Duration(seconds: 1)); // 根据需要调整延迟时间。

  // 打印解析后的头部信息。
  print('Header: ${icecastStream.header?.contentType}');

  // 设置行模式为 false,以便逐个字节监听输入。
  stdin.lineMode = false;

  // 启动命令行界面。
  while (true) {
    stdout.write("请输入命令: (\"help\" 获取帮助)\n\$ ");

    // 读取用户输入的一行。
    var input = Console.readLine();

    // 移除输入前缀(如果存在)。
    input = input?.substring(2); // 如果输入以 '$ ' 开头,则移除该前缀。

    // 根据输入执行相应操作。
    switch (input?.toLowerCase()) {
      case 'c':
        // 当输入为 'c' 时,停止监听。
        subscription.cancel();
        print('停止监听。');
        break;
      case 'help':
        // 当输入为 'help' 时,打印帮助信息。
        print('帮助:\n'
            '- "close" 停止监听。\n'
            '- "help" 获取此帮助信息。\n'
            '- "quit" 或 "exit" 退出程序。');
        break;
      case 'exit':
      case 'quit':
        // 当输入为 'exit' 或 'quit' 时,退出程序。
        print('退出程序。');
        exit(0);
        break;
      default:
        // 当输入不存在于命令列表中时,打印错误信息。
        print('错误: 未找到命令。');
        break;
    }
  }
}

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

1 回复

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


在Flutter中播放Icecast流媒体,你可以使用一些现有的音频播放插件。虽然没有一个专门的插件叫做“icecast”,但你可以使用一些通用的音频播放插件来播放Icecast流媒体,例如 just_audioaudioplayers

使用 just_audio 播放 Icecast 流媒体

just_audio 是一个功能强大的音频播放插件,支持播放网络流媒体。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 just_audio 依赖:

dependencies:
  flutter:
    sdk: flutter
  just_audio: ^0.9.24

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

2. 初始化音频播放器

main.dart 或你的其他 Dart 文件中,初始化 just_audio 播放器并播放 Icecast 流媒体:

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

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

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

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

class _IcecastPlayerState extends State<IcecastPlayer> {
  final AudioPlayer _audioPlayer = AudioPlayer();

  [@override](/user/override)
  void initState() {
    super.initState();
    _playIcecastStream();
  }

  Future<void> _playIcecastStream() async {
    try {
      await _audioPlayer.setUrl('http://your-icecast-stream-url');
      _audioPlayer.play();
    } catch (e) {
      print("Error playing stream: $e");
    }
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Icecast Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            StreamBuilder<PlayerState>(
              stream: _audioPlayer.playerStateStream,
              builder: (context, snapshot) {
                final playerState = snapshot.data;
                if (playerState?.processingState == ProcessingState.loading) {
                  return CircularProgressIndicator();
                } else if (playerState?.playing == true) {
                  return IconButton(
                    icon: Icon(Icons.pause),
                    onPressed: _audioPlayer.pause,
                  );
                } else {
                  return IconButton(
                    icon: Icon(Icons.play_arrow),
                    onPressed: _audioPlayer.play,
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

运行你的 Flutter 应用,你应该能够播放 Icecast 流媒体。

使用 audioplayers 播放 Icecast 流媒体

audioplayers 是另一个常用的音频播放插件,同样支持播放网络流媒体。

1. 添加依赖

pubspec.yaml 文件中添加 audioplayers 依赖:

dependencies:
  flutter:
    sdk: flutter
  audioplayers: ^0.20.1

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

2. 初始化音频播放器

main.dart 或你的其他 Dart 文件中,初始化 audioplayers 播放器并播放 Icecast 流媒体:

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

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

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

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

class _IcecastPlayerState extends State<IcecastPlayer> {
  final AudioPlayer _audioPlayer = AudioPlayer();
  bool _isPlaying = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    _playIcecastStream();
  }

  Future<void> _playIcecastStream() async {
    try {
      await _audioPlayer.play('http://your-icecast-stream-url');
      setState(() {
        _isPlaying = true;
      });
    } catch (e) {
      print("Error playing stream: $e");
    }
  }

  Future<void> _pauseStream() async {
    await _audioPlayer.pause();
    setState(() {
      _isPlaying = false;
    });
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Icecast Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            IconButton(
              icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow),
              onPressed: _isPlaying ? _pauseStream : _playIcecastStream,
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部