Flutter SoundCloud音频播放插件soundcloud_explode_dart的使用

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

SoundcloudExplodeDart

SoundcloudExplodeDart 利用 SoundCloud 的内部 V2 API 来抓取用户、曲目、播放列表和专辑的元数据,而无需账户、API 密钥或速率限制。

这个 API 并不是为了成为所有 SoundCloud 端点的详尽映射,但我将接受功能请求,所以请随时通过打开新问题来建议你希望看到的任何功能。

该项目受到 jerry08 的 C# 库 SoundCloudExplode 的启发。

使用方法

搜索

可以通过特定的搜索过滤器来搜索用户、曲目、播放列表或专辑:

import 'dart:async';
import 'soundcloud_explode_dart/soundcloud_explode_dart.dart';

final client = SoundcloudClient();

// 大多数函数返回结果流的形式为 Stream<Iterable<E>>。
// 在每个 Iterable<E> 中返回的结果数量以及结果偏移量和搜索过滤器是可选参数。
final stream = client.search(
    'Haddaway - What Is Love',
    searchFilter: SearchFilter.tracks,
    offset: 0,
    limit: 50
);
final streamIterator = StreamIterator(stream);

while (await streamIterator.moveNext()) {
    for (final result in streamIterator.current) {
        // 对混合流使用模式匹配
        switch (result) {
            case final UserSearchResult user:
                break;

            case final TrackSearchResult track:
                break;

            case final PlaylistSearchResult playlist:
                break;
        }
    }
}

或者,可以使用专门的函数,如 getUsers(...)getTracks(...) 等,这些函数将返回的 Iterable<E> 中的每个项转换为指定类型。

查询用户

检索特定用户的元数据:

import 'soundcloud_explode_dart/soundcloud_explode_dart.dart';

final client = SoundcloudClient();

// 用户可以通过 URL 获取...
final user1 = await client.users.getByUrl('https://www.soundcloud.com/a-user');

// ...或通过他们的用户 ID。
final user2 = await client.users.get(123456789);

// 获取特定用户上传的曲目/播放列表/专辑...
final trackStream = client.users.getTracks(user1.id);
final playlistStream = client.users.getPlaylists(user1.id);
final albumStream = client.users.getAlbums(user1.id);

查询曲目和流媒体

还可以检索特定曲目的元数据:

import 'soundcloud_explode_dart/soundcloud_explode_dart.dart';

final client = SoundcloudClient();

// 曲目也可以通过 URL 获取...
final track1 = await client.tracks.getByUrl('https://www.soundcloud.com/a-user/a-track');

// ...或通过他们的曲目 ID。
final track2 = await client.tracks.get(123456789);

为了播放曲目,需要解析可用的流媒体:

import 'soundcloud_explode_dart/soundcloud_explode_dart.dart';
import 'some_audio_player/some_audio_player.dart';

final client = SoundcloudClient();
final audioPlayer = SomeAudioPlayer();

final track = await client.tracks.getByUrl('https://www.soundcloud.com/a-user/a-track');

final streams = await client.tracks.getStreams(track.id);
final stream = streams.firstWhere((s) => s.container == Container.mp3);

await audioPlayer.play(stream.url);

注意:有些曲目只提供 30 秒的片段,无法完整播放;那些需要 SoundCloud Go 订阅的曲目就是其中之一。

要确定曲目是否可以完整播放:

if (track.duration == track.fullDuration) {
   // 曲目可以播放到结束。
   ...
}

查询播放列表/专辑

要检索特定播放列表的元数据:

import 'soundcloud_explode_dart/soundcloud_explode_dart.dart';

final client = SoundcloudClient();

// 播放列表可以通过 URL 获取...
final playlist1 = await client.playlists.getByUrl('https://www.soundcloud.com/a-user/sets/a-playlist');

// ...或通过他们的播放列表 ID。
final playlist2 = await client.playlists.get(123456789);

// 播放列表和专辑在 SoundCloud 上实际上是同义词,
// 只有一个布尔属性区分两者。
final isAlbum = playlist1.isAlbum;

// 获取播放列表中包含的曲目...
final tracks = client.playlists.getTracks(playlist1.id);

完整示例 Demo

以下是一个完整的 Flutter 示例,演示如何使用 soundcloud_explode_dart 插件来搜索和播放 SoundCloud 音频:

import 'package:flutter/material.dart';
import 'package:soundcloud_explode_dart/soundcloud_explode_dart.dart';
import 'package:just_audio/just_audio.dart'; // 假设使用 just_audio 作为音频播放器

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SoundCloud Player',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SoundCloudPlayer(),
    );
  }
}

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

class _SoundCloudPlayerState extends State<SoundCloudPlayer> {
  final client = SoundcloudClient();
  final audioPlayer = AudioPlayer(); // 使用 just_audio 的 AudioPlayer

  Future<void> playTrack(String trackUrl) async {
    final track = await client.tracks.getByUrl(trackUrl);
    final streams = await client.tracks.getStreams(track.id);
    final stream = streams.firstWhere((s) => s.container == Container.mp3);
    
    if (stream != null) {
      await audioPlayer.setUrl(stream.url);
      await audioPlayer.play();
    } else {
      print("没有找到合适的流媒体");
    }
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SoundCloud Player'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            playTrack('https://www.soundcloud.com/a-user/a-track');
          },
          child: Text('播放曲目'),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个使用 soundcloud_explode_dart 插件在 Flutter 应用中播放 SoundCloud 音频的示例代码。这个插件允许你从 SoundCloud 获取音频信息并进行播放。需要注意的是,这个插件可能涉及到网络请求和版权问题,请确保你遵守相关的使用条款和版权法。

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

dependencies:
  flutter:
    sdk: flutter
  soundcloud_explode_dart: ^最新版本号  # 请替换为实际最新版本号

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

接下来,你可以在你的 Flutter 应用中使用这个插件。以下是一个简单的示例,展示如何从 SoundCloud 获取一个音频并播放它:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final SoundCloud _soundCloud = SoundCloud(clientId: '你的SoundCloud客户端ID'); // 替换为你的SoundCloud客户端ID
  Track? _track;
  AudioPlayer? _audioPlayer;

  @override
  void initState() {
    super.initState();
    _fetchTrack();
  }

  Future<void> _fetchTrack() async {
    try {
      // 替换为你想播放的SoundCloud音频的URL
      final trackResult = await _soundCloud.getTrack('https://soundcloud.com/someuser/sometrack');
      setState(() {
        _track = trackResult.track;
      });
      _initializeAudioPlayer();
    } catch (e) {
      print('Error fetching track: $e');
    }
  }

  Future<void> _initializeAudioPlayer() async {
    if (_track != null) {
      try {
        // 从SoundCloud音频的stream_url获取音频数据
        final streamUrl = _track!.streamUrl;
        _audioPlayer = AudioPlayer()..setUrl(streamUrl!);
        // 你可以在这里添加播放控制逻辑,比如播放、暂停等
      } catch (e) {
        print('Error initializing audio player: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SoundCloud Audio Player'),
        ),
        body: Center(
          child: _track == null
              ? CircularProgressIndicator()
              : Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('Track Title: ${_track!.title}'),
                    ElevatedButton(
                      onPressed: _audioPlayer?.play ?? null,
                      child: Text('Play'),
                    ),
                    ElevatedButton(
                      onPressed: _audioPlayer?.pause ?? null,
                      child: Text('Pause'),
                    ),
                  ],
                ),
        ),
      ),
    );
  }

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

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml 文件中添加了 soundcloud_explode_dart 依赖。
  2. 创建了一个 Flutter 应用,并在 MyApp 类中初始化了 SoundCloud 实例。
  3. 使用 getTrack 方法从 SoundCloud 获取指定音频的详细信息。
  4. 从获取到的音频信息中提取 streamUrl 并初始化 AudioPlayer 实例。
  5. 在 UI 中显示音频标题,并提供播放和暂停按钮。

请注意,AudioPlayer 类并不是 soundcloud_explode_dart 插件的一部分,你可能需要使用另一个音频播放插件(如 just_audioaudioplayers)来实现音频播放功能。上面的代码示例假设你已经有一个合适的音频播放插件,并且它有一个 AudioPlayer 类和相应的方法来控制音频播放。

另外,请确保你有一个有效的 SoundCloud 客户端 ID,并将其替换到代码中相应的位置。你可以在 SoundCloud 开发者网站上创建应用并获取客户端 ID。

回到顶部