just_audio/README.md

213 lines
6.7 KiB
Markdown
Raw Normal View History

2019-11-28 06:55:32 +00:00
# just_audio
2019-11-25 14:50:21 +00:00
A Flutter plugin to play audio from URLs, files, assets, DASH/HLS streams and playlists. This plugin can be used with [audio_service](https://pub.dev/packages/audio_service) to play audio in the background and control playback from the lock screen, Android notifications, the iOS Control Center, and headset buttons.
2019-11-25 14:50:21 +00:00
2019-11-28 05:16:54 +00:00
## Features
2019-11-25 14:50:21 +00:00
2020-04-07 02:06:40 +00:00
| Feature | Android | iOS | MacOS | Web |
| ------- | :-------: | :-----: | :-----: | :-----: |
| read from URL | ✅ | ✅ | ✅ | ✅ |
| read from file | ✅ | ✅ | ✅ | |
| read from asset | ✅ | ✅ | ✅ | |
| request headers | ✅ | ✅ | ✅ | |
2020-04-07 02:06:40 +00:00
| DASH | ✅ | (untested) | (untested) | (untested) |
2020-04-30 13:47:29 +00:00
| HLS | ✅ | ✅ | (untested) | (untested) |
2020-04-07 02:06:40 +00:00
| play/pause/stop/seek | ✅ | ✅ | ✅ | ✅ |
2020-07-03 13:07:37 +00:00
| set volume | ✅ | ✅ | (untested) | ✅ |
2020-04-30 13:47:29 +00:00
| set speed | ✅ | ✅ | ✅ | ✅ |
| clip audio | ✅ | ✅ | (untested) | ✅ |
| playlists | ✅ | ✅ | (untested) | ✅ |
| looping | ✅ | ✅ | (untested) | ✅ |
| shuffle | ✅ | ✅ | (untested) | ✅ |
| compose audio | ✅ | ✅ | (untested) | ✅ |
| gapless playback | ✅ | ✅ | (untested) | |
| report player errors | ✅ | ✅ | ✅ | ✅ |
2020-03-07 03:05:54 +00:00
This plugin has been tested on Android and Web, and is being made available for testing on iOS. Please consider reporting any bugs you encounter [here](https://github.com/ryanheise/just_audio/issues) or submitting pull requests [here](https://github.com/ryanheise/just_audio/pulls).
2019-11-28 06:59:38 +00:00
## Example
2020-01-01 13:49:21 +00:00
Initialisation:
2019-11-28 06:59:38 +00:00
```dart
final player = AudioPlayer();
2020-01-01 13:49:21 +00:00
var duration = await player.setUrl('https://foo.com/bar.mp3');
```
Standard controls:
```dart
player.play(); // Usually you don't want to wait for playback to finish.
2020-01-01 13:49:21 +00:00
await player.seek(Duration(seconds: 10));
await player.pause();
2019-12-31 09:38:46 +00:00
await player.stop();
2020-01-01 13:49:21 +00:00
```
Clipping audio:
```dart
2019-12-31 09:38:46 +00:00
await player.setClip(start: Duration(seconds: 10), end: Duration(seconds: 20));
2020-01-01 13:49:21 +00:00
await player.play(); // Waits for playback to finish
```
Gapless playlists:
```dart
await player.load(
ConcatenatingAudioSource(
audioSources: [
AudioSource.uri(Uri.parse("https://example.com/track1.mp3")),
AudioSource.uri(Uri.parse("https://example.com/track2.mp3")),
AudioSource.uri(Uri.parse("https://example.com/track3.mp3")),
],
),
);
// Jump to the beginning of track3.mp3.
player.seek(Duration(milliseconds: 0), index: 2);
```
Looping and shuffling:
```dart
player.setLoopMode(LoopMode.off); // no looping (default)
player.setLoopMode(LoopMode.all); // loop playlist
player.setLoopMode(LoopMode.one); // loop current item
player.setShuffleModeEnabled(true); // shuffle except for current item
```
Composing audio sources:
```dart
player.load(
// Loop its child 4 times
LoopingAudioSource(
count: 4,
// Play children one after the other
audioSource: ConcatenatingAudioSource(
audioSources: [
// Play a regular media file
ProgressiveAudioSource(Uri.parse("https://example.com/foo.mp3")),
// Play a DASH stream
DashAudioSource(Uri.parse("https://example.com/audio.mdp")),
// Play an HLS stream
HlsAudioSource(Uri.parse("https://example.com/audio.m3u8")),
// Play a segment of the child
ClippingAudioSource(
audioSource: ProgressiveAudioSource(Uri.parse("https://w.xyz/p.mp3")),
start: Duration(seconds: 25),
end: Duration(seconds: 30),
),
],
),
),
);
```
Releasing resources:
2020-01-01 13:49:21 +00:00
```dart
2019-11-28 06:59:38 +00:00
await player.dispose();
```
2020-01-01 13:49:21 +00:00
Catching player errors:
```dart
try {
await player.setUrl("https://s3.amazonaws.com/404-file.mp3");
} catch (e) {
print("Error: $e");
}
```
Listening to state changes:
- AudioPlayer.playbackStateStream
- AudioPlayer.durationStream
- AudioPlayer.bufferingStream
- AudioPlayer.icyMetadataStream
- AudioPlayer.bufferedPositionStream
- AudioPlayer.fullPlaybackStateStream
- AudioPlayer.playbackEventStream
- AudioPlayer.currentIndexStream
- AudioPlayer.loopModeStream
- AudioPlayer.shuffleModeEnabledStream
- AudioPlayer.durationStream
e.g.
```dart
player.playbackStateStream.listen((state) {
switch (state) {
case AudioPlaybackState.none: ...
case AudioPlaybackState.stopped: ...
case AudioPlaybackState.paused: ...
case AudioPlaybackState.playing: ...
case AudioPlaybackState.connecting: ...
case AudioPlaybackState.completed: ...
}
});
```
2020-04-07 02:06:40 +00:00
## Platform specific configuration
2020-04-07 02:06:40 +00:00
### Android
If you wish to connect to non-HTTPS URLS, add the following attribute to the `application` element of your `AndroidManifest.xml` file:
```xml
<application ... android:usesCleartextTraffic="true">
```
### iOS
2020-04-07 02:06:40 +00:00
If you wish to connect to non-HTTPS URLS, add the following to your `Info.plist` file:
```xml
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsForMedia</key>
<true/>
</dict>
```
2020-05-20 15:19:03 +00:00
By default, iOS will mute your app's audio when your phone is switched to
silent mode. Depending on the requirements of your app, you can change the
default audio session category using `AudioPlayer.setIosCategory`. For example,
if you are writing a media app, Apple recommends that you set the category to
`AVAudioSessionCategoryPlayback`, which you can achieve by adding the following
code to your app's initialisation:
```dart
AudioPlayer.setIosCategory(IosCategory.playback);
```
Note: If your app uses a number of different audio plugins in combination, e.g.
for audio recording, or text to speech, or background audio, it is possible
that those plugins may internally override the setting you choose here. You may
consider asking the developer of each other plugin you use to provide a similar
method so that you can configure the same audio session category universally
across all plugins you use.
2020-04-07 02:06:40 +00:00
### MacOS
2020-04-07 02:06:40 +00:00
To allow your MacOS application to access audio files on the Internet, add the following to your `DebugProfile.entitlements` and `Release.entitlements` files:
```xml
2020-04-07 02:06:40 +00:00
<key>com.apple.security.network.client</key>
<true/>
```
If you wish to connect to non-HTTPS URLS, add the following to your `Info.plist` file:
```xml
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsForMedia</key>
<true/>
</dict>
```