BlackBerry 多媒体播放编程

作者:

 

 

概述

 

移动多 体包 使用移动 终端播 音乐 视频,拍 照,录 视频 和在线影 Bla ck Berry 支持 移动多 体, 可以 Bla ckB erry Java Bla ck Berry 浏览 来创 的媒体 用。 能包括 播放音 ,视 SV G 据,录 音频 视频,流 媒体, 及向 牙设备发 媒体流。

 

Bla ckBe rr y Ja v a 媒体支 包括 MM A P I-J SR 1 3 5 P laz m ic M edi a Eng i n e 。本 主要

MM A P I   Bla c kBerr y 平台 上的应

   

创建第一 Bl ac k Be rr y 媒体播 程序

 

Bla ckBe rr y 体开发提 供了 M M A P I ,即 P lay er jav a x.m icr o edi tio n . m edi a 包。它 媒体 源播 放,控 播放 和管理播 放状态 供了 些列方法

 

一个 P la y er 有五 状态 UN REALIZE D , R EALIZE D , P R EFETCHE D , STA R TED , CL OS ED 设计 些状 的是为 耗时 和资源的 操作提 更好 控制。

 

P lay er 建后 初始 态是 UN REA L IZED 。在 个状态 P la y er 实例 知道媒 文件 任何信 息,不 播放 体文

 

P lay er.realiz e() 方法 P layer 状体从 UN REALIZE D 变为 R EALIZE D 这个方 会访 媒体文 件或媒 资源 获取必要 的媒体 息为 放做准备

 

P lay er.p refet ch() 法会把 P lay er 态变为 P REFET CH ED 这个 态下 P l aye r 进一 获取媒 体资源 要信 并装载部 分媒体 源为 放媒体做 好准备。

 

P lay er.start () 会把 P la y er 状态 STA RT ED P la y er 会立 开始 放媒 源。

 

P lay er 没有 reali z e () p ref et ch() 是不可能 开始播 的。 sta rt() 会间接 呼叫 p refet ch( 0) 也就是 r ealiz e() 媒体 放开 。直接 star t() 会对媒 播放 成延 迟。

 

P la y er 放媒 内容 毕或者 P lay er.st o p () 方法 被叫时, p layer 会从 STA RTE D 状态 变为

P REFE TECH E D 。在   P REFECTE D   P l aye r 可以随 再次 放或循环 播放。

 

在除 CL OSED 状态 任何状 都可 呼叫 cl o s e () p lay er 状态 CL OSE D p layer

释放媒 资源 不再可用

 

P lay er.d eallo cate () P REFE TCHED REA L IZED 状态下 叫, 使 p layer 返回前 个状

 

P lay er 个状 和状 之间的 所示:

 


 

 

 

 

 

介绍了 P lay er 的方 和状态 下面 我们 Bla ckB erry 创建第一个 媒体播 程序。

 

1. 引入需 的类

 

import   javax.microedition.media.Manager;

import javax.microedition.media.Player;

import   java.io.IOException;

 

 

2.   通过 Manager.createPla yer() 方法获得 Player 实例

 

3. 呼叫 Player.realize() 方法来 播放 准备 程序获 需要 媒体 息。

 

4. 呼叫 Player.prefetch() 使 BlackBerry 应用 取必要 媒体 息, 分媒体 容为 播放做 准备。

 

5. 呼叫 Player.start() 始播放。

 

Player   p = Manager.createPlayer( "http://www.test.rim.net/abc.wav" );

 

/**

*   指向媒 文件 ab c. w av URL 作为 URI 传入 Manager.createPla yer()

*

*   最好规 是先 re al i ze () ,   然后 prefetch () ,   start() 。按 这个 续可以

*   播放延

*

*   直接呼叫 start() 是先呼叫 prefetch (0) 就是 realize() 播放。

*/

p.start();

 

 

6.   呼叫 Player.stop() 来停 止播放。

 

7. 呼叫 Player.close() 使 Player 进入 CLOSED player 实例 再可

 

 

B lack B er ry   播放编程

 

播放音频范例

 

本节介 如何在 Bl ackB err y 上创 一个 频播放器 播放 m p 3 并提 播放 暂停, 制。 播放器 下图 示:

 

 

 

这个播 器运 Bla ckB erry 9 7 0 0 模拟 上,界面 显示了 歌曲时长 ,播放 态, 操作 按钮 ( 停, 放, ) 。下列 幅图 示播放状 态的变

 

 

 


上图播 状态 “正在播 放”, Al l Ris e 被播放。

 

 

 

 

 

 

上图播 状态 暂停,歌 曲暂停 放, 是按下播 放按钮 以继 播放。

 

 

 

 

 

 

上图播 状态 停止。在 停止状 ,播 器实例不 能够被 新利 。再按播 放按钮 应用 序会 销毁 P la y er 实例 创建 P la y er 行播

 


播放器源代码

 

 

public   class MusicPlayerApp   extends   UiApplication{

 

public static void main(String[] args){

 

//   应用程 启动

getInstance ().enterEventDispatcher();

}

 

//   MusicPlayerApp 的单类

private   static MusicPlayerApp   m_instance ;

 

private MusicPlayerScreen musicPlayerScreen ;

 

public MusicPlayerApp(){

 

// 创建播 器屏幕

musicPlayerScreen   =   new   MusicPlayerScreen();

 

//   推出屏 堆栈 显示 放器屏幕

pushScreen( musicPlayerScreen );

}

 

//   实现     MusicPlayerAp p   单类, 行环 中只有一 MusicPlayerApp 实例

public   static synchronized MusicPlayerApp   getInstance(){

if   ( m_instance   ==   null ){

m_instance = new MusicPlayerApp();

}

return   m_instance ;

}

 

 

 

 

以上代 表示使   Bl ac kB err y   提供的   U I   界面 g e tI ns t an ce( ) 使用 了单例 即程 运行环

  M usi cPl a y erAp p     g e tI ns t an ce( ) M us i cPl a y erAp p   实例而导致对象状态不稳定 g e tI ns t an ce( ). en t erEv en t D i spa t che r ( )   这行代码 创建了 M usi cPl a y erAp p 的实例 调用 en t erEv entDi spa t che r ( ) 动应

 

 

// 播放器

class   MusicPlayerScreen   extends   MainScreen   implements

FieldChangeListener{

 

public static final String SONG_NAME = "All Rise" ;

 

// 指向歌 URI

public   static final String   URI   =   "/sounds/all_rise.mp3" ;

 

// 歌曲的 audio/m peg 支持 mp3

public   static final String   AUDIO_FORMAT   =   "audio/mpeg" ;

 

// 播放器 所有

public   static final int PLAYING   =   0;

public static final int READY_FOR_PLAY = 1;

public   static final int PAUSE   =   2;

public   static final int STOP   =   3;

 

// 播放器 当前

private   int m_currentStatus   =   READY_FOR_PLAY ;

 

// 播放器

private   Player   m_player ;

 

// 播放器 Layout

private   VerticalFieldManager   m_labelManager ;

 

// 播放器

private   LabelField   m_songNameField ;

private   LabelField   m_durationField ;

private   LabelField   m_statusField ;

 

// 播放按 Layout

private   HorizontalFieldManager   m_buttonManager ;

 

// 播放器

private   ButtonField   m_pauseButton ;

private   ButtonField   m_playButton ;

private ButtonField m_stopButton ;

 

public MusicPlayerScreen(){

 

super (Manager. NO_HORIZONTAL_SCROLL |Manager. NO_VERTICAL_SCROLL );

 

// 创建播 器并 好播 准备

createPlayer();

 

//   创建界面

initializeUI();

}

 


M us i cPl a y erSce en 构造函数描 启动 M usi cPl a yerScreen 行的任务 ,创建 放器 初始化 界面。

 

 

private   void initializeUI(){

 

setTitle( new LabelField( " 黑莓播 " , Fi el d. FIELD_VCENTER |Field. FIELD_HCENTER ));

 

// 歌曲名 标签

m_songNameField   =   new   LabelField( " 歌曲 :   " + SONG_NAME ,   Fi e ld . USE_ALL_WIDTH );

 

// 歌曲时长

m_durationField   =   new   LabelField( " 播放 :   "

+ m_player .getDuration()/1000000/60+ " 分钟 " ,   Fi e ld . USE_ALL_WIDTH );

 

// 播放状态

m_statusField   =   ne w   LabelField( " 播放 :   " +getStatus(),   Field. USE_ALL_WIDTH );

 

m_labelManager = new

VerticalFieldManager(Manager. NO_HORIZONTAL_SCROLL |Manager. NO_VERTICAL_SCROLL ); m_labelManager .add( m_songNameField ); m_labelManager .add( m_durationField ); m_labelManager .add( m_statusField );

 

add( m_labelManager );

 

// 暂停按钮

m_pauseButton   =   new   ButtonField( "||" ,

Field. FIELD_VCENTER |Field. FIELD_HCENTER );

 

m_pauseButton .setChangeListener( this );

 

// 播放按钮

m_playButton   =   new   ButtonField( ">" ,   Field. FIELD_VCENTER |Field. FIELD_HCENTER );

m_playButton .setChangeListener( this );

 

// 停止按钮

m_stopButton   =   new   ButtonField( "O" ,   Field. FIELD_VCENTER |Field. FIELD_HCENTER );

m_stopButton .setChangeListener( this );

 

m_buttonManager = new

HorizontalFieldManager(Manager. NO_HORIZONTAL_SCROLL |Manager. NO_VERTICAL_SCROLL

);

 

m_buttonManager .add( m_pauseButton ); m_buttonManager .add( m_playButton ); m_buttonManager .add( m_stopButton );

 

add( m_buttonManager );

}

 

 

 

函数 i ni t i ali z e U I( ) U I 组建 并按 构组装 签和 制按

 


// 获取 前播放

private   String   getStatus(){

 

switch ( m_currentStatus ){

 

case PLAYING :

return   " 正在播放 " ;

case   READY_FOR_PLAY :

return   " 准备完毕 " ;

case   PAUSE :

return   " 暂停 " ;

case   STOP :

return   " 停止 " ;

}

 

return   null ;

}

 

 

函数 g etS t atus ( ) 根绝当前 播放器 态来 取状态消 息。

 

 

//   根据 置的播 状态 新状 标签

private   void setPlayerStatus( int   status){

m_currentStatus = status;

m_statusField .setText( " 播放状态 :   " +g et S ta tu s( )) ;

}

 

 

setPl ay erStat us(in t ) 当前播 器状 来更新播 放器状 标签。

 

 

//   创建播

private   void createPlayer(){

 


try {


 

// 关闭当

if   ( m_player   !=   null ){

m_player .close();

m_player   =   null ;


}

 

// 创建新 放器

InputStream   is = this .getClass().getResourceAsStream( URI );

m_player = javax.microedition.media.Manager. createPlayer (is,

AUDIO_FORMAT );

 

// 预装媒 准备播放

m_player .prefetch();

} catch (Exception   ex){

ex.printStackTrace();

}

}

 


函数 cr ea t ePl ay er( ) Pl ay er 实例,并预装载媒 体内容 播放 好准备。 如果当前 Pl ay er 实例 已经存 ,它 先销毁当 Pl ay er 然后再创建新 Pl ay er

 

public   void fieldChanged(Field   field, int   context)   {

if   (field   == m_playButton ){

 

// 当播放 钮按

//   根据播 器当 状态 行处理

switch   ( m_currentStatus ){

case   PLAYING :

this .setPlayerStatus( PLAYING );

return ;

case READY_FOR_PLAY :

try {

m_player .start();

} catch (Exception   ex){}

setPlayerStatus( PLAYING );

return ;

case   PAUSE :

try {

m_player .start();

} catch (Exception   ex){}

setPlayerStatus( PLAYING );

return ;

case   STOP :

createPlayer();

try {

m_player .start();

} catch (Exception   ex){}

setPlayerStatus( PLAYING );

return ;

}

} else   if (field   == m_pauseButton ){

 

// 当暂停 钮按

//   根据播 器当 状态 行处理

switch   ( m_currentStatus ){

case PLAYING :

try {

m_player .stop();

} catch (Exception   ex){}

setPlayerStatus( PAUSE );

return ;

case   READY_FOR_PLAY :

return ;

case   PAUSE :

return ;

case   STOP :

try {

m_player .close();

} catch (Exception   ex){}

setPlayerStatus( STOP );

return ;

}

}


else if (field == m_stopButton ){

 

// 当停止 按钮 下时

//   根据播 器当 状态 行处理

switch   ( m_currentStatus ){

case PLAYING :

try {

m_player .stop();

m_player .close();

} catch (Exception   ex){}

setPlayerStatus( STOP );

return ;

case READY_FOR_PLAY :

try {

m_player .close();

} catch (Exception   ex){}

setPlayerStatus( STOP );

return ;

case   PAUSE :

try {

m_player .close();

} catch (Exception   ex){}

setPlayerStatus( STOP );

return ;

case   STOP :

return ;

}

}

}

}

}

 

 

 

 

f i el dC ha n g ed ( Fi el d   f i el d,   i nt   con t ex t) 做为按钮 听接口,根据按钮事件判断执行哪一段按钮事件。

三个按 分别 :播放, 暂停, 止。 每个按钮 的事件 应根 播放器当 前状态 执行 同任 务,详 描述 查看注释

 


Bl ac kB erry   播放编程

 

Bla ckBe rr y M M A P I P la y er Bla ckB erry 面框 上播 。视频 式包括 m pg ,

3 gp , av i 。以下代码 片段分 解释在   M ID P   Bla ckBe rr y UI 种框架下 的视频 放。

 

 

 

对于提 L C D UI 支持 M I D P 现:

 

 

public   void playVideo()   {

try {

 

// Player 源为网 上的 频, 视频信息 Player p = Manager. createPlayer ( "http://abc.mpg" ); p.realize();

 

// 界面控

GUIControl gc;

 

// 获取界 控制器

//   使 Item 视频

//   Item 添加到 Form 再显 Form

//   实现了 Form 播放

if   ((gc   = (GUIControl) p.getControl( "GUIControl" ))   != null )   {

Form   form = new   Form( "My   GUI" );

form.append((Item) gc.initDisplayMode( GUIControl. USE_GUI_PRIMITIVE , null ));

Display.getDisplay ( this ).setCurrent(form);

}

 

// 开始播放

p.start();

 

}   catch   (MediaException   pe) {

} catch (IOException ioe) {

}

}

 

 

范例 ( 1 )

 

M I D P 架下 面方 有两种 F o r m Can v as For m M I D P 下的高级 UI 组件 器与组 的结 。上述代 码是在 M ID P 高级 UI 中播放 频。 Can v as M ID P 中的 级界 面,程 员需 Can v a s 上绘制 己的 UI 范例 ( 2 ) Can v as 放视频。

 

 

M ID P Can v a s 上播放 :

 

 

public   void playVideo( Canvas   canvas ) {

try   {

 

// 创建 Player 源为网 上的 频, 视频信息 Player p = Manager. createPlayer ( "http://abc.mpg" ); p.realize();

 

// 视频控

VideoControl vidc;

 

// 获取视 控制器

//   传入 Canvas 置在 C an vas 里播放

//   使用视 控制 置播 参数

if ((vidc   = ( VideoControl ) p.getControl( "VideoControl" ))   !=

null ){

vidc.initDisplayMode( VideoControl. USE_DIRECT_VIDEO , canvas);

vidc.setDisplayFullScreen( true );

vidc.setVisible( true );

}

 

// 开始播放

p.start();

 

}   catch   (MediaException   pe) {

} catch (IOException ioe) {

}

}

 

 

 

 

 

范例 ( 2 )

 

在使用 Can v as 放视 时,需 获取 Vid e o C o n tr o l 可以把 C an v as 作为 播放组 ,同 提供一 些方法 整视 显示位置 和尺寸。

 

以上是 M ID P 下高级 UI 和低级 UI 放视频的 方法。在 Bla ckB erry 平台 上如果 用程 使用的

  M I D P 架开 视频 放,可 直接使 用这两个 范例 Bla c kBerr y 台提   Bla ckB erry 特有的   UI

框架, 架结 J 2 SE 比较类 Co n tain er-L a y o u tM an ag er -Co m p o n ent 的结构。 Bla ckB erry 最基 本的 UI Fi eld 频需要在 Fi eld 里进行播 放,如 ( 3 ) 示。

 

 

Bla ckBe rr y UI 架下播放 :

 

 

 

public   void playVideo(){

 


try {


 

// 创建新 放器

InputStream   is = this .getClass().getResourceAsStream( URI );

m_player = javax.microedition.media.Manager. createPlayer (is,

VIDEO_FORMAT );

 

// 获取视 文件 息, 一步一 要有 否则 VideoControl 将无效

m_player .realize();

 

// 获取视 控制

m_videoControl =

(VideoControl) m_player .getControl( "VideoControl" );

 

if ( m_videoControl != null )

{


//   从视频 制获取 UI 组件, 个组 用来 频,常 组件比如 Field

m_videoField = (Field) m_videoControl .initDisplayMode

(VideoControl. USE_GUI_PRIMITIVE ,

"net.rim.device.api.ui.Field" );

 

// 设置

m_videoControl .setDisplayFullScreen( true );

 

//   使视 可见

m_videoControl .setVisible( true );

}

 

if   ( m_videoField   !=   null ){

//   添加视 组件到屏 幕并开 播放

add( m_videoField );

m_player .start();

}

 

} catch (Exception ex){

ex.printStackTrace();

}

}

 

 

 

范例 ( 3 )

 

创建播 器和 放流 M I D P 架下 播放 相同, 在获 显示视频 组件时 所不 ,对于

Bla ckBe rr y 的界面要 求在   Fi eld 示视

 

Field videoField = (Field)

m_videoControl .initDisplayMode(VideoControl. USE_GUI_PRIMITIVE ,

"net.rim.device.api.ui.Field" );

 

 

要注意 是获取 Vi d eo C on tro l 一定 让播 器获取 体信 P la y er.r ealiz e() 否则 取的

Vid eo C o n tro l 无效。

 

   

以上是 三种 面框架下 的播放 式。 Bla ckB erry Bla ck Berry 界面的 频播 ,以 下是一 完整 代码例子

 

 

import   java.io.InputStream;

import   javax.microedition.media.Player;

import javax.microedition.media.control.VideoControl;

import   net.rim.device.api.ui.Field;

import net.rim.device.api.ui.Manager;

import   net.rim.device.api.ui.UiApplication;

import   net.rim.device.api.ui.container.MainScreen;

 

public class VideoPlayerApp extends UiApplication{ private static VideoPlayerApp m_instance ; private VideoScreen m_videoPlayerScreen ; public static void main(String[] args){

//   应用程 启动

getInstance ().enterEventDispatcher();

}

 

public   VideoPlayerApp(){

 

// 创建播 器屏幕

m_videoPlayerScreen   =   new   VideoScreen();

 

//   推出屏 堆栈 显示 放器屏幕

pushScreen( m_videoPlayerScreen );

}

 

//   实现     VideoPlayerAp p 单类, 行环 中只有一 VideoPlayerApp 实例

public   static synchronized VideoPlayerApp   getInstance(){

if ( m_instance == null ){

m_instance   =   new   VideoPlayerApp();

}

return   m_instance ;

}

 

//   播放器

class   VideoScreen   extends   MainScreen{

 

// 指向本 视频 URI

public   static final String   URI   =   "/video/song.3GP" ;;

 

 


// 播放器

private   Player   m_player ;

 

// 视频播 控制

private   VideoControl   m_videoControl ;

 

private Field m_videoField ;

 

public VideoScreen(){

 

super (Manager. NO_HORIZONTAL_SCROLL |Manager. NO_VERTICAL_SCROLL );

 

// VideoScreen 放视频

playVideo();

 

}

 

// 创建播

private   void playVideo(){

 

try {

//   创建新 放器

InputStream   is = this .getClass().getResourceAsStream( URI );

m_player = javax.microedition.media.Manager. createPlayer (is,

VIDEO_FORMAT );

 

// 获取视 文件 息, 一步一 要有 否则 VideoControl 将无效

m_player .realize();

 

// 获取视 控制

m_videoControl = (VideoControl) m_player .getControl( "VideoControl" );

 

if ( m_videoControl != null )

{

//   从视频 制获 UI 组件, 个组 用来 频,常 组件比如 Field

m_videoField = (Field) m_videoControl .initDisplayMode

(VideoControl. USE_GUI_PRIMITIVE ,   "net.rim.device.api.ui.Field" );

 

// 设置显 尺寸

m_videoControl .setDisplayFullScreen( true );

 

//   使视频

m_videoControl .setVisible( true );

}

 

if   ( m_videoField   !=   null ){

 

//   添加视 组件到屏 幕并开 播放

add( m_videoField );

m_player .start();

}

 

 

} catch (Exception ex){

ex.printStackTrace();

}

}

 

//   阻止屏 弹出     save 菜单

public   boolean onSavePrompt(){

return   true ;

}

}

}

 

 

 

 
 

 

 

BlackBerry SDK下载

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值