2025终极指南:ExoPlayer后台播放Service与通知栏控制完整实现
2025终极指南ExoPlayer后台播放Service与通知栏控制完整实现【免费下载链接】ExoPlayerThis project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayerExoPlayer是Android平台上最强大的开源媒体播放库为开发者提供了完整的视频和音频播放解决方案。本文将深入探讨如何利用ExoPlayer实现专业的后台播放功能通过Service与通知栏的无缝集成让你的应用在后台运行时依然能够稳定播放音频并支持锁屏控制和通知栏交互。掌握这些技术你的应用将具备与Spotify、YouTube Music等专业音频应用相媲美的后台播放体验。 为什么需要后台播放Service在Android应用中实现后台播放面临三大挑战音频焦点管理、Service生命周期管理和用户交互界面。ExoPlayer通过精心设计的架构解决了这些问题音频焦点管理- 确保应用在播放时能正确处理系统音频焦点Service保活- 避免播放进程被系统回收用户交互- 提供锁屏控制和通知栏操作ExoPlayer直播窗口时间管理示意图 - 展示播放器如何处理直播流的时间轴️ 核心架构设计模块依赖关系ExoPlayer的后台播放功能主要依赖以下核心模块核心播放模块library/core/ - 提供基础的播放器功能UI组件模块library/ui/ - 包含通知管理和UI控件MediaSession扩展extensions/mediasession/ - 系统媒体会话集成技术栈选择dependencies { implementation com.google.android.exoplayer:exoplayer-core:2.19.1 implementation com.google.android.exoplayer:exoplayer-ui:2.19.1 implementation com.google.android.exoplayer:extension-mediasession:2.19.1 } 创建后台播放ServiceService基础实现创建一个继承自Service的播放器服务用于在后台管理ExoPlayer实例的生命周期public class AudioPlaybackService extends Service { private ExoPlayer player; private PlayerNotificationManager notificationManager; private AudioFocusManager audioFocusManager; Override public void onCreate() { super.onCreate(); initializePlayer(); setupAudioFocus(); createNotificationChannel(); setupMediaSession(); } private void initializePlayer() { // 创建ExoPlayer实例 player new ExoPlayer.Builder(this) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setHandleAudioBecomingNoisy(true) .build(); // 设置播放器监听器 player.addListener(new Player.Listener() { Override public void onPlaybackStateChanged(int state) { handlePlaybackStateChange(state); } Override public void onPlayerError(PlaybackException error) { handlePlaybackError(error); } }); } }Service清单配置在AndroidManifest.xml中正确配置Serviceservice android:name.AudioPlaybackService android:foregroundServiceTypemediaPlayback android:exportedfalse android:enabledtrue intent-filter action android:nameandroid.intent.action.MEDIA_PLAYBACK_SERVICE / /intent-filter /service uses-permission android:nameandroid.permission.FOREGROUND_SERVICE / uses-permission android:nameandroid.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK / 通知栏播放器实现PlayerNotificationManager配置ExoPlayer提供了强大的PlayerNotificationManager工具类简化通知栏播放器的实现private void setupNotificationManager() { // 创建通知渠道Android 8.0必需 String channelId audio_playback_channel; String channelName 音频播放; if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { NotificationChannel channel new NotificationChannel( channelId, channelName, NotificationManager.IMPORTANCE_LOW ); channel.setDescription(音频播放通知); channel.enableLights(false); channel.enableVibration(false); channel.setShowBadge(false); NotificationManager manager getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } // 创建媒体描述适配器 MediaDescriptionAdapter descriptionAdapter new DefaultMediaDescriptionAdapter( new MediaDescriptionAdapter() { Override public CharSequence getCurrentContentTitle(Player player) { return getCurrentTitle(); } Override public PendingIntent createCurrentContentIntent(Player player) { Intent intent new Intent(AudioPlaybackService.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); return PendingIntent.getActivity( AudioPlaybackService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); } // 其他方法实现... } ); // 创建通知管理器 notificationManager new PlayerNotificationManager.Builder( this, NOTIFICATION_ID, channelId ) .setMediaDescriptionAdapter(descriptionAdapter) .setNotificationListener(new NotificationListener() { Override public void onNotificationPosted( int notificationId, Notification notification, boolean ongoing ) { // 启动前台服务 startForeground(notificationId, notification); } Override public void onNotificationCancelled( int notificationId, boolean dismissedByUser ) { // 用户取消通知时停止服务 stopSelf(); } }) .setSmallIconResourceId(R.drawable.ic_music_note) .setNextActionIconResourceId(R.drawable.ic_skip_next) .setPreviousActionIconResourceId(R.drawable.ic_skip_previous) .setPlayActionIconResourceId(R.drawable.ic_play_arrow) .setPauseActionIconResourceId(R.drawable.ic_pause) .setStopActionIconResourceId(R.drawable.ic_stop) .build(); // 绑定播放器 notificationManager.setPlayer(player); }ExoPlayer UI布局自定义对比 - 展示默认布局与自定义覆盖布局的效果差异 MediaSession深度集成MediaSessionConnector配置MediaSessionConnector是ExoPlayer与Android系统MediaSession的桥梁实现锁屏控制、音量键控制等系统级功能private void setupMediaSession() { // 创建MediaSession mediaSession new MediaSessionCompat(this, AudioPlaybackService); mediaSession.setCallback(new MediaSessionCompat.Callback() { Override public void onPlay() { if (player ! null) { player.setPlayWhenReady(true); } } Override public void onPause() { if (player ! null) { player.setPlayWhenReady(false); } } // 其他回调方法... }); mediaSession.setActive(true); // 创建MediaSessionConnector MediaSessionConnector connector new MediaSessionConnector(mediaSession); // 设置播放器 connector.setPlayer(player); // 设置自定义命令处理器 connector.setCustomActionProviders( new PlaybackStateCompat.CustomAction.Builder( CUSTOM_ACTION_REPEAT, Repeat, R.drawable.ic_repeat ).build() ); // 将MediaSession令牌传递给通知管理器 notificationManager.setMediaSessionToken(mediaSession.getSessionToken()); }播放队列管理对于需要管理播放列表的应用可以扩展QueueNavigatorconnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) { Override public MediaDescriptionCompat getMediaDescription( Player player, int windowIndex ) { MediaItem mediaItem player.getMediaItemAt(windowIndex); return new MediaDescriptionCompat.Builder() .setMediaId(mediaItem.mediaId) .setTitle(mediaItem.mediaMetadata.title) .setSubtitle(mediaItem.mediaMetadata.artist) .setIconUri(mediaItem.mediaMetadata.artworkUri) .build(); } }); 音频焦点管理AudioFocusManager使用ExoPlayer内置了AudioFocusManager简化音频焦点处理private void setupAudioFocus() { audioFocusManager new AudioFocusManager( this, new AudioFocusManager.PlayerCommand() { Override public void execute(int playerCommand) { switch (playerCommand) { case AudioFocusManager.PLAYER_COMMAND_PLAY_WHEN_READY: player.setPlayWhenReady(true); break; case AudioFocusManager.PLAYER_COMMAND_DO_NOT_PLAY: player.setPlayWhenReady(false); break; } } } ); // 设置音频焦点类型 audioFocusManager.setAudioAttributes( new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_MUSIC) .build(), AudioFocusManager.AUDIOFOCUS_GAIN ); } private boolean requestAudioFocus() { return audioFocusManager.requestAudioFocus(); } private void abandonAudioFocus() { audioFocusManager.abandonAudioFocus(); } 完整的Service实现Service生命周期管理public class AudioPlaybackService extends Service { private static final int NOTIFICATION_ID 1; private static final String ACTION_PLAY ACTION_PLAY; private static final String ACTION_PAUSE ACTION_PAUSE; private static final String ACTION_STOP ACTION_STOP; private ExoPlayer player; private PlayerNotificationManager notificationManager; private MediaSessionCompat mediaSession; private AudioFocusManager audioFocusManager; Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent ! null) { String action intent.getAction(); String mediaUri intent.getStringExtra(MEDIA_URI); if (ACTION_PLAY.equals(action) mediaUri ! null) { playMedia(mediaUri); } else if (ACTION_PAUSE.equals(action)) { pausePlayback(); } else if (ACTION_STOP.equals(action)) { stopPlayback(); } } return START_STICKY; } private void playMedia(String mediaUri) { // 请求音频焦点 if (!requestAudioFocus()) { // 音频焦点请求失败 stopSelf(); return; } // 准备媒体内容 MediaItem mediaItem MediaItem.fromUri(mediaUri); player.setMediaItem(mediaItem); player.prepare(); player.setPlayWhenReady(true); // 更新通知和MediaSession updateNotification(); updateMediaSession(); } Override public void onDestroy() { // 清理资源 if (notificationManager ! null) { notificationManager.setPlayer(null); } if (player ! null) { player.release(); player null; } if (mediaSession ! null) { mediaSession.setActive(false); mediaSession.release(); } abandonAudioFocus(); super.onDestroy(); } // 其他方法... }从Activity控制Servicepublic class MainActivity extends AppCompatActivity { private void startPlaybackService(String mediaUri) { Intent serviceIntent new Intent(this, AudioPlaybackService.class); serviceIntent.setAction(AudioPlaybackService.ACTION_PLAY); serviceIntent.putExtra(MEDIA_URI, mediaUri); if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { ContextCompat.startForegroundService(this, serviceIntent); } else { startService(serviceIntent); } } private void pausePlayback() { Intent serviceIntent new Intent(this, AudioPlaybackService.class); serviceIntent.setAction(AudioPlaybackService.ACTION_PAUSE); startService(serviceIntent); } private void stopPlayback() { Intent serviceIntent new Intent(this, AudioPlaybackService.class); serviceIntent.setAction(AudioPlaybackService.ACTION_STOP); startService(serviceIntent); } } 自定义通知样式自定义通知布局如果需要更复杂的通知样式可以创建自定义通知布局!-- res/layout/custom_notification.xml -- RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_height64dp android:padding8dp ImageView android:idid/album_art android:layout_width48dp android:layout_height48dp android:layout_alignParentStarttrue android:layout_centerVerticaltrue android:scaleTypecenterCrop / LinearLayout android:layout_widthwrap_content android:layout_heightwrap_content android:layout_toEndOfid/album_art android:layout_centerVerticaltrue android:layout_marginStart12dp android:orientationvertical TextView android:idid/title android:layout_widthwrap_content android:layout_heightwrap_content android:textSize14sp android:textColorandroid:color/white android:maxLines1 android:ellipsizeend / TextView android:idid/subtitle android:layout_widthwrap_content android:layout_heightwrap_content android:textSize12sp android:textColorandroid:color/white android:maxLines1 android:ellipsizeend / /LinearLayout !-- 控制按钮等 -- /RelativeLayout自定义MediaDescriptionAdapterpublic class CustomMediaDescriptionAdapter implements MediaDescriptionAdapter { private final Context context; private final Bitmap defaultAlbumArt; public CustomMediaDescriptionAdapter(Context context) { this.context context; this.defaultAlbumArt BitmapFactory.decodeResource( context.getResources(), R.drawable.default_album_art ); } Override public CharSequence getCurrentContentTitle(Player player) { MediaItem currentMediaItem player.getCurrentMediaItem(); if (currentMediaItem ! null currentMediaItem.mediaMetadata.title ! null) { return currentMediaItem.mediaMetadata.title; } return context.getString(R.string.unknown_title); } Override public Bitmap getCurrentLargeIcon( Player player, PlayerNotificationManager.BitmapCallback callback ) { // 异步加载专辑封面 MediaItem currentMediaItem player.getCurrentMediaItem(); if (currentMediaItem ! null currentMediaItem.mediaMetadata.artworkUri ! null) { loadAlbumArtAsync(currentMediaItem.mediaMetadata.artworkUri, callback); return null; // 返回null表示异步加载 } return defaultAlbumArt; } private void loadAlbumArtAsync( Uri artworkUri, PlayerNotificationManager.BitmapCallback callback ) { // 使用Glide或Picasso异步加载图片 // 加载完成后调用callback.onBitmap } }高分辨率媒体资源示例 - 展示ExoPlayer处理高质量图片/视频的能力⚡ 性能优化技巧内存管理及时释放资源在Service的onDestroy中释放所有资源使用适当的缓存策略配置ExoPlayer的缓存大小避免内存泄漏使用弱引用或静态内部类private static class PlayerHolder { private final WeakReferenceAudioPlaybackService serviceRef; PlayerHolder(AudioPlaybackService service) { this.serviceRef new WeakReference(service); } void play(String url) { AudioPlaybackService service serviceRef.get(); if (service ! null service.player ! null) { service.player.setMediaItem(MediaItem.fromUri(url)); service.player.prepare(); service.player.setPlayWhenReady(true); } } }电池优化使用WakeLock在播放时保持设备唤醒优化网络使用使用合适的缓冲策略及时释放WakeLock播放停止后立即释放private PowerManager.WakeLock wakeLock; private void acquireWakeLock() { PowerManager powerManager (PowerManager) getSystemService(POWER_SERVICE); wakeLock powerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, AudioPlaybackService::WakeLock ); wakeLock.acquire(10 * 60 * 1000L /*10分钟*/); } private void releaseWakeLock() { if (wakeLock ! null wakeLock.isHeld()) { wakeLock.release(); wakeLock null; } } 常见问题与解决方案问题1通知栏控制按钮不响应解决方案确保正确设置了MediaSession检查Notification的PendingIntent配置验证MediaSessionConnector是否正确绑定// 确保MediaSession已激活 mediaSession.setActive(true); // 检查PendingIntent的flags PendingIntent contentIntent PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );问题2后台播放被系统杀死解决方案使用前台Service正确处理Service的START_STICKY实现onTaskRemoved重启逻辑Override public void onTaskRemoved(Intent rootIntent) { // 任务被移除时重新启动Service Intent restartService new Intent(this, AudioPlaybackService.class); restartService.setPackage(getPackageName()); startService(restartService); super.onTaskRemoved(rootIntent); }问题3音频焦点冲突解决方案正确处理音频焦点变化实现音频焦点监听器提供用户可配置选项audioFocusManager.setAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() { Override public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_LOSS: // 永久失去焦点停止播放 stopPlayback(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // 暂时失去焦点暂停播放 if (player.isPlaying()) { player.pause(); shouldResumeOnFocusGain true; } break; case AudioManager.AUDIOFOCUS_GAIN: // 重新获得焦点恢复播放 if (shouldResumeOnFocusGain !player.isPlaying()) { player.play(); } shouldResumeOnFocusGain false; break; } } }); 进一步学习资源官方文档和源码ExoPlayer官方文档docs/ - 包含完整的API文档和使用指南核心播放器源码library/core/src/main/java/com/google/android/exoplayer2/ - 深入理解播放器实现UI组件源码library/ui/src/main/java/com/google/android/exoplayer2/ui/ - 学习UI组件实现MediaSession扩展extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/ - MediaSession集成实现示例应用主Demo应用demos/main/ - 完整的播放器示例Cast Demodemos/cast/ - 投屏功能示例Transformer Demodemos/transformer/ - 媒体转换示例最佳实践测试不同场景在后台、锁屏、多任务等场景下测试性能监控使用Android Profiler监控内存和CPU使用用户反馈收集用户反馈持续优化体验 总结通过本文的完整指南你已经掌握了使用ExoPlayer实现专业级后台播放服务的所有关键技术。从基础的Service创建到复杂的通知栏控制从音频焦点管理到MediaSession集成每个环节都经过了精心设计和优化。记住这些关键点使用前台Service确保后台播放稳定性合理管理音频焦点避免冲突充分利用PlayerNotificationManager简化通知实现通过MediaSessionConnector实现系统级集成注重性能优化和电池效率现在你已经具备了构建专业音频播放应用的所有知识。开始实现你的ExoPlayer后台播放功能为用户提供无缝的音频体验吧提示在实际项目中建议参考ExoPlayer的官方示例和测试用例确保实现的最佳实践和兼容性。定期检查项目的RELEASENOTES.md文件了解最新功能和改进。【免费下载链接】ExoPlayerThis project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

3个终极华硕笔记本控制指南:告别臃肿软件,重获性能自由

3个终极华硕笔记本控制指南:告别臃肿软件,重获性能自由

3个终极华硕笔记本控制指南:告别臃肿软件,重获性能自由 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook,…

2026/7/31 23:10:17 阅读更多 →
终极指南:PoeCharm汉化版快速上手,打造你的《流放之路》最强角色

终极指南:PoeCharm汉化版快速上手,打造你的《流放之路》最强角色

终极指南:PoeCharm汉化版快速上手,打造你的《流放之路》最强角色 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的角色构建头疼吗?PoeCh…

2026/7/31 23:10:17 阅读更多 →
3分钟搞定QQ空间历史说说备份:GetQzonehistory免费工具终极指南

3分钟搞定QQ空间历史说说备份:GetQzonehistory免费工具终极指南

3分钟搞定QQ空间历史说说备份:GetQzonehistory免费工具终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里的珍贵回忆会随着时间消失?那…

2026/7/31 23:10:17 阅读更多 →

最新新闻

UiPath Community Register

UiPath Community Register

https://cloud.uipath.com/portal_/register打开链接 → 注册账号(QQ/163 等个人邮箱均可,无需企业邮箱) 注册类型选择 Community(社区版免费方案) 邮箱验证完成,进入云端控制台 左侧菜单【资源中心 Resour…

2026/8/1 0:58:13 阅读更多 →
PUTTY.EXE  PSCP.EXE

PUTTY.EXE PSCP.EXE

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>d:D:\> D:\> D:\>cd D:\puttyD:\putty> D:\putty>Linux → WindowsD:\putty>pscp admin192.168.1.110:/home/oceanbase-4.3.5.5-1050…

2026/8/1 0:58:13 阅读更多 →
2026年制造业短视频运营公司深度评测:工厂短视频获客选型参考

2026年制造业短视频运营公司深度评测:工厂短视频获客选型参考

数字营销新浪潮:短视频AI搜索重构制造企业获客路径时代背景与行业数据2026年,数字营销正式进入短视频与AI搜索深度融合的新阶段。抖音、视频号、小红书等平台凭借精准的算法推荐与搜索能力,成为工业品、制造业、工程建设等ToB高客单行业品牌曝…

2026/8/1 0:57:13 阅读更多 →
5分钟彻底清理:Win11Debloat让Windows重获新生的完整方案

5分钟彻底清理:Win11Debloat让Windows重获新生的完整方案

5分钟彻底清理:Win11Debloat让Windows重获新生的完整方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…

2026/8/1 0:56:13 阅读更多 →
YimMenu完整指南:5步掌握GTA5最强防崩溃工具

YimMenu完整指南:5步掌握GTA5最强防崩溃工具

YimMenu完整指南:5步掌握GTA5最强防崩溃工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

2026/8/1 0:56:13 阅读更多 →
多智能体编排实战:CrewAI vs AutoGen(2026版)

多智能体编排实战:CrewAI vs AutoGen(2026版)

# 多智能体编排实战:CrewAI vs AutoGen(2026版)## 一、背景:2026年AI应用开发的三大挑战2026年,AI/Machine Learning开发已从“模型训练”转向“系统集成”。根据Yotec 2026年发布的《AI & Machine Learning Devel…

2026/8/1 0:56:13 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →