Mainkan musik / audio yang disimpan dalam file aset (secara bersamaan) langsung dari Flutter (Android / iOS / Web / MacOS).
Anda juga dapat menggunakan file Audio Play dari jaringan menggunakan URL, radio/streaming langsung dan file lokal mereka
Pemberitahuan dapat ditampilkan di Android & iOS, dan tindakan Bluetooth ditangani
flutter :
assets :
- assets/audios/ AssetsAudioPlayer . newPlayer (). open (
Audio ( "assets/audios/song1.mp3" ),
autoStart : true ,
showNotification : true ,
);

dependencies :
assets_audio_player : ^3.0.8 Bekerja dengan flutter: ">=3.3.0" , pastikan untuk meningkatkan SDK Anda
Anda menyukai paketnya? belikan aku kofi :)
| Sumber audio | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ? ️ file aset (jalur aset) | ✅ | ✅ | ✅ | ✅ |
| File Jaringan (URL) | ✅ | ✅ | ✅ | ✅ |
| ? File lokal (jalur) | ✅ | ✅ | ✅ | ✅ |
| ? Jaringan langsung / radio (URL) ( Default, hls, dasbor, smoothstream ) | ✅ | ✅ | ✅ | ✅ |
| Fitur | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ? Banyak pemain | ✅ | ✅ | ✅ | ✅ |
| ? Daftar putar terbuka | ✅ | ✅ | ✅ | ✅ |
| Pemberitahuan sistem | ✅ | ✅ | ||
| Tindakan Bluetooth | ✅ | ✅ | ||
| ? Hormati Sistem Mode Diam | ✅ | ✅ | ||
| ? Berhentilah pada panggilan telepon | ✅ | ✅ |
| Perintah | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ▶ Mainkan | ✅ | ✅ | ✅ | ✅ |
| ⏸ Jeda | ✅ | ✅ | ✅ | ✅ |
| ⏹ Berhenti | ✅ | ✅ | ✅ | ✅ |
| ⏩ Mencari (posisi) | ✅ | ✅ | ✅ | ✅ |
| ⏪⏩ Seekby (posisi) | ✅ | ✅ | ✅ | ✅ |
| ⏩ Maju (kecepatan) | ✅ | ✅ | ✅ | ✅ |
| ⏪ Rewind (kecepatan) | ✅ | ✅ | ✅ | ✅ |
| ⏭ Selanjutnya | ✅ | ✅ | ✅ | ✅ |
| ⏮ Sebelumnya | ✅ | ✅ | ✅ | ✅ |
| Widget | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ? Widget Audio | ✅ | ✅ | ✅ | ✅ |
| ? Pembangun widget | ✅ | ✅ | ✅ | ✅ |
| ? Ekstensi Pembangun Audioplayer | ✅ | ✅ | ✅ | ✅ |
| Properti | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ? Lingkaran | ✅ | ✅ | ✅ | ✅ |
| ? Shuffle | ✅ | ✅ | ✅ | ✅ |
| ? Get/Setel Volume | ✅ | ✅ | ✅ | ✅ |
| ⏩ Dapat/atur kecepatan bermain | ✅ | ✅ | ✅ | ✅ |
| ⏩ Dapat/atur pitch | ✅ |
| Pendengar | Android | iOS | Web | MacOS |
|---|---|---|---|---|
| ? Pendengar onready (selesai) | ✅ | ✅ | ✅ | ✅ |
| ? Pendengar Currentposition | ✅ | ✅ | ✅ | ✅ |
| ? Pendengar selesai | ✅ | ✅ | ✅ | ✅ |
| ? Penyangga pendengar | ✅ | ✅ | ✅ | ✅ |
| ? Volume pendengar | ✅ | ✅ | ✅ | ✅ |
| ? Pendengar mempermainkan kecepatan | ✅ | ✅ | ✅ | ✅ |
| ? Pitch pendengar | ✅ |
Tidak perlu menyalin lagu ke cache media, dengan asets_audio_player Anda dapat membukanya langsung dari aset.
flutter :
assets :
- assets/audios/ final assetsAudioPlayer = AssetsAudioPlayer ();
assetsAudioPlayer. open (
Audio ( "assets/audios/song1.mp3" ),
);Anda juga dapat memainkan lagu jaringan dari URL
final assetsAudioPlayer = AssetsAudioPlayer ();
try {
await assetsAudioPlayer. open (
Audio . network ( "http://www.mysite.com/myMp3file.mp3" ),
);
} catch (t) {
//mp3 unreachable
}Streaming langsung / radio dari url
Perbedaan utama dengan jaringan, jika Anda berhenti/bermain, pada live -streaming itu akan dilanjutkan hingga menyajikan durasi
final assetsAudioPlayer = AssetsAudioPlayer ();
try {
await assetsAudioPlayer. open (
Audio . liveStream ( MY_LIVESTREAM_URL ),
);
} catch (t) {
//stream unreachable
}Dan putar lagu dari file
//create a new player
final assetsAudioPlayer = AssetsAudioPlayer ();
assetsAudioPlayer. open (
Audio . file ( FILE_URI ),
);Untuk file uri, silakan lihat https://pub.dev/packages/path_provider
assetsAudioPlayer. playOrPause ();
assetsAudioPlayer. play ();
assetsAudioPlayer. pause ();assetsAudioPlayer. seek ( Duration to);
assetsAudioPlayer. seekBy ( Duration by);assetsAudioPlayer. forwardRewind ( double speed);
//if positive, forward, if negative, rewind assetsAudioPlayer. stop ();

di iOS, itu akan menggunakan MPNowPlayingInfoCenter
final audio = Audio . network ( "/assets/audio/country.mp3" ,
metas : Metas (
title : "Country" ,
artist : "Florent Champigny" ,
album : "CountryAlbum" ,
image : MetasImage . asset ( "assets/images/country.jpg" ), //can be MetasImage.network
),
);showNotification: true _player. open (audio, showNotification : true )Ikon Kustom (hanya Android)
Pastikan Anda menambahkan ikon -ikon itu di dalam android/res/drawable Anda !!! tidak pada aset flutter !!!!
await _assetsAudioPlayer. open (
myAudio,
showNotification : true ,
notificationSettings : NotificationSettings (
customStopIcon : AndroidResDrawable (name : "ic_stop_custom" ),
customPauseIcon : AndroidResDrawable (name : "ic_pause_custom" ),
customPlayIcon : AndroidResDrawable (name : "ic_play_custom" ),
customPrevIcon : AndroidResDrawable (name : "ic_prev_custom" ),
customNextIcon : AndroidResDrawable (name : "ic_next_custom" ),
)
Dan jangan lupa beri tahu proguard untuk menjaga sumber daya tersebut untuk mode rilis
(Bagian Penyimpan Sumber Daya)
https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/resource-shrinking
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< resources xmlns : tools = " http://schemas.android.com/tools "
tools:keep= " @drawable/ic_next_custom, @drawable/ic_prev_custom, @drawable/ic_pause_custom, @drawable/ic_play_custom, @drawable/ic_stop_custom " /> Tambahkan ikon Anda ke folder res Android Anda (Android/App/SRC/Main/Res)
Referensi ikon ini ke AndroidManifest Anda (Android/App/SRC/Main/AndroidManifest.xml)
< meta-data
android : name = " assets.audio.player.notification.icon "
android : resource = " @drawable/ic_music_custom " />Anda juga dapat mengubah ikon tindakan
<meta-data
android:name="assets.audio.player.notification.icon.play"
android:resource="@drawable/ic_play_custom"/>
<meta-data
android:name="assets.audio.player.notification.icon.pause"
android:resource="@drawable/ic_pause_custom"/>
<meta-data
android:name="assets.audio.player.notification.icon.stop"
android:resource="@drawable/ic_stop_custom"/>
<meta-data
android:name="assets.audio.player.notification.icon.next"
android:resource="@drawable/ic_next_custom"/>
<meta-data
android:name="assets.audio.player.notification.icon.prev"
android:resource="@drawable/ic_prev_custom"/>
Tambahkan Main
AssetsAudioPlayer . setupNotificationsOpenAction ((notification) {
//custom action
return true ; //true : handled, does not notify others listeners
//false : enable others listeners to handle it
});Maka jika Anda menginginkan tindakan khusus di widget
AssetsAudioPlayer . addNotificationOpenAction ((notification) {
//custom action
return false ; //true : handled, does not notify others listeners
//false : enable others listeners to handle it
});Anda dapat mengaktifkan/menonaktifkan tindakan pemberitahuan
open ( AUDIO ,
showNotification : true ,
notificationSettings : NotificationSettings (
prevEnabled : false , //disable the previous button
//and have a custom next action (will disable the default action)
customNextAction : (player) {
print ( "next" );
}
)
)Setelah pembuatan audio Anda, telepon saja
audio. updateMetas (
player : _assetsAudioPlayer, //add the player if the audio is actually played
title : "My new title" ,
artist : "My new artist" ,
//if I not provide a new album, it keep the old one
image : MetasImage . network (
//my new image url
),
);Anda harus mengaktifkan pemberitahuan untuk membuat mereka bekerja
Perintah jarak jauh yang tersedia:
(Hanya untuk Android untuk saat ini)
Saat membuka lagu/daftar putar, tambahkan strategi
assetsAudioPlayer. open (
...
headPhoneStrategy : HeadPhoneStrategy .pauseOnUnplug,
//headPhoneStrategy: HeadPhoneStrategy.none, //default
//headPhoneStrategy: HeadPhoneStrategy.pauseOnUnplugPlayOnPlug,
)Jika Anda ingin membuatnya bekerja di Bluetooth juga, Anda harus menambahkan izin Bluetooth di dalam androidmanifest.xml Anda
< uses-permission android : name = " android.permission.BLUETOOTH " />Anda dapat membuat asetseudioplayer baru menggunakan assetseudioplayer.newplayer (), yang akan memutar lagu di media media asli yang berbeda
Ini akan memungkinkan untuk memainkan dua lagu secara bersamaan
Anda dapat memiliki pemain sebanyak yang Anda inginkan!
///play 3 songs in parallel
AssetsAudioPlayer . newPlayer (). open (
Audio ( "assets/audios/song1.mp3" )
);
AssetsAudioPlayer . newPlayer (). open (
Audio ( "assets/audios/song2.mp3" )
);
//another way, with create, open, play & dispose the player on finish
AssetsAudioPlayer . playAndForget (
Audio ( "assets/audios/song3.mp3" )
); Setiap pemain memiliki id yang dihasilkan unik, Anda dapat mengambil atau membuatnya secara manual menggunakan
final player = AssetsAudioPlayer . withId (id : "MY_UNIQUE_ID" );assetsAudioPlayer. open (
Playlist (
audios : [
Audio ( "assets/audios/song1.mp3" ),
Audio ( "assets/audios/song2.mp3" )
]
),
loopMode : LoopMode .playlist //loop the full playlist
);
assetsAudioPlayer. next ();
assetsAudioPlayer. prev ();
assetsAudioPlayer. playlistPlayAtIndex ( 1 ); Jika Anda ingin cara yang lebih berkobar untuk bermain audio, coba AudioWidget !

//inside a stateful widget
bool _play = false ;
@override
Widget build ( BuildContext context) {
return AudioWidget . assets (
path : "assets/audios/country.mp3" ,
play : _play,
child : RaisedButton (
child : Text (
_play ? "pause" : "play" ,
),
onPressed : () {
setState (() {
_play = ! _play;
});
}
),
onReadyToPlay : (duration) {
//onReadyToPlay
},
onPositionChanged : (current, duration) {
//onPositionChanged
},
);
}Bagaimana caranya? berhenti ? Audiowidget?
Lepaskan saja audio dari pohon! Atau terus play: false
Semua pendengar memaparkan aliran menggunakan RXDART, AssetsAudiOplayer memperlihatkan beberapa pendengar sebagai nilaiob dapat diawasi (dapat diamati yang menyediakan akses sinkron ke item terakhir yang dipancarkan);
//The current playing audio, filled with the total song duration
assetsAudioPlayer.current //ValueObservable<PlayingAudio>
//Retrieve directly the current played asset
final PlayingAudio playing = assetsAudioPlayer.current.value;
//Listen to the current playing song
assetsAudioPlayer.current. listen ((playingAudio){
final asset = playingAudio.assetAudio;
final songDuration = playingAudio.duration;
}) //Listen to the current playing song
final duration = assetsAudioPlayer.current.value.duration;assetsAudioPlayer.currentPosition //ValueObservable<Duration>
//retrieve directly the current song position
final Duration position = assetsAudioPlayer.currentPosition.value;
return StreamBuilder (
stream : assetsAudioPlayer.currentPosition,
builder : (context, asyncSnapshot) {
final Duration duration = asyncSnapshot.data;
return Text (duration. toString ());
}),Atau gunakan PlayerBuilder!
PlayerBuilder . currentPosition (
player : _assetsAudioPlayer,
builder : (context, duration) {
return Text (duration. toString ());
}
)atau Ekstensi Pembangun Pemain
_assetsAudioPlayer. builderCurrentPosition (
builder : (context, duration) {
return Text (duration. toString ());
}
)Boolean dapat diamati mewakili status bermain mediaplayer saat ini
assetsAudioPlayer.isPlaying // ValueObservable<bool>
//retrieve directly the current player state
final bool playing = assetsAudioPlayer.isPlaying.value;
//will follow the AssetsAudioPlayer playing state
return StreamBuilder (
stream : assetsAudioPlayer.isPlaying,
builder : (context, asyncSnapshot) {
final bool isPlaying = asyncSnapshot.data;
return Text (isPlaying ? "Pause" : "Play" );
}),Atau gunakan PlayerBuilder!
PlayerBuilder . isPlaying (
player : _assetsAudioPlayer,
builder : (context, isPlaying) {
return Text (isPlaying ? "Pause" : "Play" );
}
)atau Ekstensi Pembangun Pemain
_assetsAudioPlayer. builderIsPlaying (
builder : (context, isPlaying) {
return Text (isPlaying ? "Pause" : "Play" );
}
)Ubah volume (antara 0,0 & 1.0)
assetsAudioPlayer. setVolume ( 0.5 ); Pemutar media dapat mengikuti sistem "mode volume" (bergetar, diredam, normal) cukup atur parameter opsional respectSilentMode sebagai true
_player. open ( PLAYABLE , respectSilentMode : true );https://developer.android.com/reference/android/media/audiomanager.html?hl=fr#getringerMode ()
https://developer.apple.com/documentation/avfoundation/avaudiosessionCategorysoloambient
Dengarkan volumenya
return StreamBuilder (
stream : assetsAudioPlayer.volume,
builder : (context, asyncSnapshot) {
final double volume = asyncSnapshot.data;
return Text ( "volume : $ volume " );
}),Atau gunakan PlayerBuilder!
PlayerBuilder . volume (
player : _assetsAudioPlayer,
builder : (context, volume) {
return Text ( "volume : $ volume " );
}
)Dipanggil saat lagu saat ini telah selesai untuk diputar,
Ini memberikan audio bermain yang baru saja selesai
assetsAudioPlayer.playlistAudioFinished //ValueObservable<Playing>
assetsAudioPlayer.playlistAudioFinished. listen (( Playing playing){
})Dipanggil saat playlist lengkap telah selesai untuk bermain
assetsAudioPlayer.playlistFinished //ValueObservable<bool>
assetsAudioPlayer.playlistFinished. listen ((finished){
}) final LoopMode loopMode = assetsAudioPlayer.loop;
// possible values
// LoopMode.none : not looping
// LoopMode.single : looping a single audio
// LoopMode.playlist : looping the fyll playlist
assetsAudioPlayer. setLoopMode ( LoopMode .single);
assetsAudioPlayer.loopMode. listen ((loopMode){
//listen to loop
})
assetsAudioPlayer. toggleLoop (); //toggle the value of loopingassetsAudioPlayer. setPlaySpeed ( 1.5 );
assetsAudioPlayer.playSpeed. listen ((playSpeed){
//listen to playSpeed
})
//change play speed for a particular Audio
Audio audio = Audio . network (
url,
playSpeed : 1.5
);
assetsAudioPlayer. open (audio);assetsAudioPlayer. setPitch ( 1.2 );
assetsAudioPlayer.pitch. listen ((pitch){
//listen to pitch
})
//change pitch for a particular Audio
Audio audio = Audio . network (
url,
pitch : 1.2
);
assetsAudioPlayer. open (audio);Secara default, pada kesalahan bermain, itu menghentikan audio
Tetapi Anda dapat menambahkan perilaku khusus
_player.onErrorDo = (handler){
handler.player. stop ();
};Buka audio lain
_player.onErrorDo = (handler){
handler.player. open ( ANOTHER_AUDIO );
};Coba buka lagi pada posisi yang sama
_player.onErrorDo = (handler){
handler.player. open (
handler.playlist. copyWith (
startIndex : handler.playlistIndex
),
seek : handler.currentPosition
);
}; Android hanya mengizinkan panggilan https, Anda akan memiliki kesalahan jika Anda menggunakan http, jangan lupa untuk menambahkan izin internet dan seet usesCleartextTraffic="true" di androidmanifest.xml Anda
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
iOS hanya mengizinkan panggilan https, Anda akan memiliki kesalahan jika Anda menggunakan http, jangan lupa untuk mengedit info Anda. Plist dan atur NSAppTransportSecurity ke NSAllowsArbitraryLoads
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Untuk mengaktifkan panggilan http pada macOS, Anda harus menambahkan kemampuan panggilan input/output ke dalam info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
</array>
<key>com.apple.security.network.client</key>
<true/>
dan di Anda
Runner/DebugProfile.entitlements
menambahkan
<key>com.apple.security.network.client</key>
<true/>
Runner/DebugProfile.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
Semua musik yang digunakan dalam sampel berasal dari https://www.freemusicarchive.org/