基于QT前端的mplayer播放器项目文档

基于QT前端的mplayer播放器项目文档
基于QT前端的mplayer播放器项目文档

基于QT前端的mplayer播放器项目文档V1.0

一、项目概述

Mplayer。它支持大量的多媒体文件格式,像常见的音频文件如mp3/wav/mid,常见的视频文件如avi/vcd/dvd/rm等等,各种视频编/解码方式也是应有尽有。

我们项目的目标是在liunx下,用QT做一个MPlayer皮肤,能够实现播放器的常见

功能,如:播放、停止、快进、快退、上/下一曲等。并把程序移植到ARM平台上。

二、功能体验

本节主要目的是让大家在学习具体实现过程前,先体验下播放器的功能。

1、PC端功能体验

将―项目代码\工程代码‖目录下的mplayer.tar.gz拷贝linux系统中(主机环境配置好以后,参照第四节的实现过程)。

#tar xvfz mplayer.tar.gz

#./mplayer

2、目标平台功能体验

l 将―项目代码\工程镜像‖文件夹中的zImage、rootfs.cramfs烧写到目标板(或者采用nfs方式)。分区情况为:

Boot:0 - 40000 size=0x40000

Kernel:40000 – 240000 size=0x200000

Rootfs:240000 -3740000 size=0x3500000

启动参数为:

setenv root=1f02 init=/linuxrc rootfstype=cramfs console=ttySAC0,115200 display=sam240 setenv bootcmd setenv bootcmd nand read 30008000 40000 200000 \; go 30008000

l 启动系统后运行:

#. ./Qtopia.sh

#cd mymplayer

#./mymplayer -qws

三、实现原理

先来考虑考虑如何为mplayer编写前端界面的问题。有两种思路,一种是把mplayer解剖,直接修改他里面的代码,这样我们做得界面就能够和mplayer一体了(当然也能够通过link mplayer用到的任何的库和.o文档,把他无缝的集成在程式里面);第二种方法就是mplayer 所谓的slave模式。

mplayer '/home/linux/1.mp3' -quiet -slave

现在来探讨一下slave模式:所谓的slave模式,就是mplayer在运行过程中能够接收用户的输入命令行,具体支持哪些命令行,能够通过mplayer -input cmdlist这条命令来得到,在Mplayer源码的slave.txt中也有对这些命令有详细的讲解。Slave模式下工作的Mplayer可以和系统的标准输入、输出进行信息交互。我们可以用linux C编程来完成对slave模式工作的Mplayer进行控制和信息获取。

如:

mkfifo(―/tmp/fifo‖,0777);

可以使用popen()来打开Mplayer

FILE* mp;

mp=popen(―mplyer /home/l inux/1.mp3 -quiet –slave –input file=/tmp/fifo,‖r‖);

可以通过管道/tmp/fifo给mplayer发送命令,通过mp获取mplay的返回数据

如:system(―echo \‖mute 0\‖ > /tmp/fifo‖);//写命令

fgets(buf,1000,mp);//读取mplay返回数据

而Qt给我们提供了更方便的实现方法。

通过定义一个QProcess对象调用已编译好的Mplayer。

QProcess *process = new QProcess();

process->setProcessChannelMode(QProcess::MergedChannels);

Process->start(―mplayer –ac mad xxxxx‖);

在命令中添加-slave 和-quiet就可以通过命令设置Mplayer实现相应的功能。在mplayer 源码中的,slave.txt中对这些命令有详细的讲解。

Process->start(―mplayer –slave –quiet –ac mad xxxxx‖);

1、暂停功能

通过如下代码可以设置Mplayer暂停。

process->write(―pause ‖);

执行这段代码的时候如果是播放状态就会暂停,暂停状态时就会继续播放。

2、获取播放文件的总时间和当前播放进度

执行下面代码时,Mplayer将时间在标准输出显示。

process->write("get_time_pos ");

process->write("get_time_length ");

通过如下代码即可读出我们需要的信息:

connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots())); process有可读取的信息时,发出信号,在槽函数back_message_slots()中读取信息。

void MPlayer::back_message_slots()

{

while(process->canReadLine())

{

QString message(process->readLine());

//message即为读取的信息我们可以根据需要取我们要的信息如

//文件总时间为:ANS_LENGTH=23.00

//当前时间为:ANS_TIME_POS IT ION=23.00

}

}

3、快进功能

seek [type]

Seek to some place in the movie.

0 is a relative seek of +/- seconds (default).

1 is a seek to % in the movie.

2 is a seek to an absolute position of seconds.

下面代码即可实现快进功能:

process->write(―seek ** 1 ‖);

4、音量调节

volume [abs]

Increase/decrease volume or set it to if [abs] is nonzero.

下面代码即可实现快进功能:

Process->write(―volume -1 ‖); //音量减小

Process->write(―volume +1‖); //音量增加

5、静音功能

mute [value]

Toggle sound output muting or set it to [value] when [value] >= 0

(1 == on, 0 == off).

下面代码即可实现快进功能:

process->write("mute 0 "); //开启静音

process->write("mute 1 "); //关闭静音

6、定位视频窗口

通过上面的代码基本功能实现了,可是播放视频的时候发现又弹出一个窗口。并没有出现在我们的窗口里。

如下代码即可时间窗口的定位。

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());

process->start(common);

红色部分实现窗口的定位。Widget是一个QWidget对象。通过winId可以获得一个数字,-wid 既将视频输出定位到widget窗体部件中。

注意:-wid参数只在X11、directX和OpenGL中适用。

四、PC环境下的实现过程

1、PC环境搭建

主机环境:Red Hat Enterprise Linux 5.0

交叉编译工具:gcc-3.4.5-glibc-2.3.6

主机编译工具:gcc-4.1.2

(1)主机端安装mplayer

l 将―项目代码/mplay源码‖目录下的MPlayer-1.0rc2.tar.bz2、libmad-0.15.1b.tar.gz(1个mp3解码库)拷贝到linux系统中,如:/home/linux/mplayer目录下

l 安装libmad-0.15.1b.tar.gz

#tar xvfz libmad-0.15.1b.tar.gz

#cd libmad-0.15.1b

#./configure

#make

#mkdir /lib/lib

#mkdir /lib/include

#cp mad.h /lib/include

#cp .libs/libmad.a /lib/lib

l 安装mplayer

#tar xvfj MPlayer-1.0.rc2.tar.bz2

#cd MPlayer-1.0rc2

#./configure --with-extraincdir=/lib/include --with-extralibdir=/lib/lib

#make

#make install

此时可以试着播放一下mp3、avi等文件了

# mplayer -ac mad 1.mp3

# mplayer -ac mad 2.avi

(2)安装、移植qtopia-4.2.0

注:需要先按照5.2节将tslib按照好

l 将―项目代码/qtopia源码‖目录下的qtopia-opensource-src-4.2.0.tar.gz拷贝到linux 系统中,如:/home/linux/Qtopia目录下

# tar zxvf qtopia-opensource-src-4.2.0.tar.gz

# mv qtopia-opensource-4.2.0 source

# mkdir target //创建在source同级目录下创建目录target

修改源码包

# cd source

# cd src/libraries/qtopiabase/

# cp custom-linux-cassiopeia-g++.h custom-linux-arm-g++.h

# cp custom-linux-cassiopeia-g++.cpp custom-linux-arm-g++.cpp

修改时区信息

# vi src/libraries/qtopia/qtimezone.cpp

将114行的/usr/share/zoneinfo/ 改为/Qtipia/zoneinfo/ ,保存退出。

# vi src/settings/systemtime/settime.cpp

将318行的/usr/share/zoneinfo/ 改为/Qtipia/zoneinfo/ ,保存退出。

l 裁减Qtopia core的库(下列操作后在屏幕上会出现一个光标,否则没有光标。根据需求配置)

# vi qtopiacore/qconfig-qpe.h

首先注释掉关于鼠标光标的宏定义,让程序运行时,触摸屏中央有光标出现:

// Qtopia Core

/*

#ifndef QT_NO_QWS_CURSOR

# define QT_NO_QWS_CURSOR

#endif

*/

/*

#ifndef QT_NO_QWS_MOUSE

# define QT_NO_QWS_MOUSE

#endif

#ifndef QT_NO_QWS_MOUSE_AUTO

# define QT_NO_QWS_MOUSE_AUTO

#endif

*/

其它宏定义根据需要进行注释。

保存后将qconfig-qpe.h拷贝到global目录。

# cp qtopiacore/qconfig-qpe.h qtopiacore/qt/src/corelib/global/qconfig-qpe.h (必须进行的操作) 注释掉其他文件里的QT_NO_QWS_CURSOR的定义

# vi qtopiacore/qt/src/corelib/global/qfeatures.h

注释掉如下内容:

/*

#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))

#define QT_NO_QWS_CURSOR

#endif

*/

保存退出。

# vi qtopiacore/qt/src/corelib/global/qglobal.h

注释掉以下内容:

//# define QT_NO_QWS_CURSOR

#vim qtopiacore/qt/tools/qvfb/qvfbshmem.cpp

注释掉asm/page.h

//#include

#vim qtopiacore/qt/tools/qvfb/qvfbmmap.cpp

注释掉asm/page.h

//#include

并修改如下内容

unsigned char *data;

uint data_offset_value = sizeof(QVFbHeader);

if (data_offset_value % PAGE_SIZE)

data_offset_value += PAGE_SIZE - (data_offset_value % PAGE_SIZE);

为:

unsigned char *data;

uint data_offset_value = sizeof(QVFbHeader);

const int page_size = getpagesize();

if (data_offset_value % page_size)

data_offset_value += page_size - (data_offset_value % page_size);

# vim src/libraries/qtopiabase/qmemoryfile_unix.cpp +128

修改

f = ::open(tmpFile.toLatin1(), O_CREAT | O_WRONL Y);

为:

f = ::open(tmpFile.toLatin1(), O_CREAT | O_WRONL Y ,0777);

l 修改交叉工具

#vim qtopiacore/qt/mkspecs/qws/linux-arm-g++/qmake.conf

将文件中的arm-linux-***全部修改为arm-softfloat-linux-gnu-**

这样做的前提是我的交叉工具链是arm-softfloat-linux-gnu,如果你的是arm-linux就不用改了。

l 生成Makefile

#cd ../target //为了不破坏源码,选择在此目录下配置、编译源码

#../source/configure -release -image /Qtopia -prefix /Qtopia -xplatform linux-arm-g++ -arch arm -no-qvfb -displaysize 320x240 -no-modem -extra-qtopiacore-config "-release -xplatform qws/linux-arm-g++ -embedded arm -qconfig qpe -depths 4,8,16,32 -qt-sql-sqlite -no-mouse-linuxtp -qt-mouse-tslib -I/home/linux/tslib/include -L/home/linux/tslib/lib "

2>../configureERR.txt

注意:这里/Qtopia是最后Qtopia的安装路径,安装到主机的某个路径下,最终这个路径和目标板上的路径必须一致。

主要配置选项说明如下:

-xplatform linux-arm-g++ -arch arm

目标平台为arm-linux,体系结构为arm。

-no-qvfb

目标平台已支持framebuffer,因而不使用虚拟帧缓冲。

-extra-qtopiacore-config

为Qtopia core 配置选项。

-xplatform qws/linux-arm-g++ -embedded arm

目标平台编译配置文件使用qtopiacore/qt/mkspecs/qws/linux-arm-g++目录下的配置文件,嵌入式平台为arm。

-qconfig qpe

使用配置文件qconfig-qpe.h,若使用qconfig-large.h配置文件,则使用-qconfig large选项。-qt-sql-sqlite

数据库支持Sqlite。

-qt-kbd-usb

键盘支持usb协议。

-no-mouse-linuxtp -qt-mouse-tslib

-I/home/linux/tslib/include -L/home/linux/tslib/lib

触摸屏协议不支持linuxtp,支持tslib,并在后面添加上刚才编译的tslib的头文件和库。2>../qtopiaconfigureERR.txt

最后将配置过程中的错误输出到qtopiaconfigureERR.txt文件中。

l 编译

#make

#make install

l 将安装和的目录考到nfsroot目录下

#cp /Qtopia /rootfs -a

(3)熟悉主机开发环境

l 提供给PC端的开发工具

上面的qtopia编译安装完成后,会在咱们前面创建的target目录下生成很多开发工具。

先看一下供主机端使用的工具

[root@localhost bin]# pwd

/home/linux/Qtopia/target/qtopiacore/host/bin

[root@localhost bin]# ls

assistant linguist lupdate qmake rcc uic

designer lrelease moc qvfb templates uic3

如果系统以前有其它qt开发工具,把环境变量修改一下,保证它们不要和我们这几个工具冲突。下面可以试一下你的designer了。

#./designer

2、在PC端实现基于qt前端的mplayer播放器

创建工程目录/home/linux/mplayer

(1)搭建ui界面

利用前面安装的designer搭建ui界面,并将其保存至/home/linux/mplayer/mplayer.ui

#./designer

圆角矩形标注: 加了一个widget,留作mplayer的播放区

(2)编写程序

在/home/linux/mymplayer/下创建mplayer.cpp、mplayer.h、main.cpp 、image.qrc

Main.cpp

/*****************************main.cpp*****************************/ #include

#include "mplayer.h"

int main(int argc, char **argv)

{

QApplication app(argc, argv);

MPlayer player; //实例最终的MPlayer类

player.show(); //显示界面

return app.exec(); //运行程序

}

mplayer.h

#ifndef _MPLAYER_H

#define _MPLAYER_H

#include

#include

#include

#include

#include

#include

#include

#include "ui_mplayer.h"

class MPlayer:public QDialog,private Ui_Dialog

{

Q_OBJECT

public:

MPlayer(QWidget *parent = 0);

public:

QTime int_to_time(int);

public slots:

void play_pause_slots(); //暂停

void stop_slots(); //停止

void previous_slots(); //上一曲

void next_slots(); //下一曲

void seek_slots(int);

void get_time_slots(); //得到播放时间

void set_volume_slots(int); //设置音量

void set_sound_slots(); //静音

void playerReward_slots(); //快退

void playerForward_slots(); //快进

void back_message_slots(); //更新显示信息

private:

QProcess *process;

QStringList files;

QDir directory;

int file_count;

QString file_name;

bool isPlay;

bool isSound;

bool isStop;

QTimer *timer;

int file_length;

int curr_time;

};

#endif

mplayer.cpp

/*******************************mplayer.cpp **********************************/

#include "mplayer.h"

#include

#include

MPlayer::MPlayer(QWidget *parent):QDialog(parent)

{

setupUi(this); //初始化界面

isPlay = true;

isSound = true;

isStop = false;

/************************为按键添加图标**************************/

//play

QIcon icon_play;

icon_play.addPixmap(QPixmap(QString::fromUtf8("images/pause_enabled.png")),

QIcon::Normal, QIcon::Off);

pushButton_2->setIcon(icon_play);

//stop

QIcon icon_stop;

icon_stop.addPixmap(QPixmap(QString::fromUtf8("images/stop_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_3->setIcon(icon_stop);

//reward

QIcon icon_reward;

icon_reward.addPixmap(QPixmap(QString::fromUtf8("images/reward_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_4->setIcon(icon_reward);

//forward

QIcon icon_forward;

icon_forward.addPixmap(QPixmap(QString::fromUtf8("images/forward_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_5->setIcon(icon_forward);

//sound

QIcon icon_sound;

icon_sound.addPixmap(QPixmap(QString::fromUtf8("images/sound_enabled.png")),

QIcon::Normal, QIcon::Off);

pushButton->setIcon(icon_sound);

QIcon icon_previous;

icon_previous.addPixmap(QPixmap(QString::fromUtf8("images/previous_disabled.png")), QIcon::Normal, QIcon::Off);

pushButton_6->setIcon(icon_previous);

QIcon icon_next;

icon_next.addPixmap(QPixmap(QString::fromUtf8("images/next_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_7->setIcon(icon_next);

/************************设置按钮无边框**********************************/ pushButton->setFlat(true);

pushButton_2->setFlat(true);

pushButton_3->setFlat(true);

pushButton_4->setFlat(true);

pushButton_5->setFlat(true);

pushButton_6->setFlat(true);

pushButton_7->setFlat(true);

/*************************获得播放列表***************************/

directory.setPath("./movie");

files = directory.entryList(QDir::AllEntries,QDir::Time);

file_name = files[2]; //文件0和1为‖.‖ ‖..‖,所以从文件2开始播放

file_count = 2;

label_3->setText(files[2]);

/*************************初始化进度条及QProcess类**************/ horizontalSlider->setPageStep(1);

process = new QProcess(this);

process->setProcessChannelMode(QProcess::MergedChannels);

/*************************初始化信号、槽*************************/

connect(pushButton_2,SIGNAL(clicked()),this,SLOT(play_pause_slots()));

connect(pushButton_3,SIGNAL(clicked()),this,SLOT(stop_slots()));

connect(pushButton_4,SIGNAL(clicked()),this,SLOT(playerReward_slots()));

connect(pushButton_5,SIGNAL(clicked()),this,SLOT(playerForward_slots()));

connect(pushButton_6,SIGNAL(clicked()),this,SLOT(previous_slots()));

connect(pushButton_7,SIGNAL(clicked()),this,SLOT(next_slots()));

//connect(horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(seek_slots(int)));

connect(spinBox,SIGNAL(valueChanged(int)),this,SLOT(set_volume_slots(int)));

connect(pushButton,SIGNAL(clicked()),this,SLOT(set_sound_slots()));

connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots()));

//当process可以读到Mplayer的返回信息时,产生readyReadStandardOutput()信号

//process->start("mplayer -slave -quiet -ac mad 2.avi");

//add -wid QWidget->winId();

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " +

QString::number(widget->winId()); //这里的widget是ui中MPlayer的显示区

process->start(common); //开始运行程序

spinBox->setValue(40);

timer = new QTimer(this);

connect(timer,SIGNAL(timeout()),this,SLOT(get_time_slots()));

//定时获取MPlayer的时间信息

timer->start(1000); //启动定时器1秒timeout 1次

}

void MPlayer::play_pause_slots()

{

if(!isPlay)

{

if(isStop)

{

file_name = files[file_count];

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());

process->start(common);

QIcon icon_stop;

icon_stop.addPixmap(QPixmap(QString::fromUtf8("images/stop_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_3->setIcon(icon_stop);

isStop = false;

}

else

{

process->write("pause ");

}

QIcon icon_play;

icon_play.addPixmap(QPixmap(QString::fromUtf8("images/pause_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_2->setIcon(icon_play);

isPlay = true;

}

else

{

QIcon icon_pause;

icon_pause.addPixmap(QPixmap(QString::fromUtf8("images/play_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_2->setIcon(icon_pause);

isPlay = false;

process->write("pause ");

}

}

void MPlayer::stop_slots()

{

if(!isStop)

{

process->write("quit ");

QIcon icon_pause;

icon_pause.addPixmap(QPixmap(QString::fromUtf8("images/play_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_2->setIcon(icon_pause);

isPlay = false;

QIcon icon_stop;

icon_stop.addPixmap(QPixmap(QString::fromUtf8("images/stop_disabled.png")), QIcon::Normal, QIcon::Off);

pushButton_3->setIcon(icon_stop);

isStop = true;

label->setText("00:00:00");

label_2->setText("00:00:00");

}

}

void MPlayer::previous_slots()

{

if(file_count > 2)

{

if(file_count == (files.size()-1))

{

QIcon icon_next;

icon_next.addPixmap(QPixmap(QString::fromUtf8("images/next_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_7->setIcon(icon_next);

}

process->write("quit ");

process = new QProcess(this);

connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots()));

file_count--;

if(!isStop)

{

file_name = files[file_count];

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());

process->start(common);

}

if(file_count == 2)

{

QIcon icon_previous;

icon_previous.addPixmap(QPixmap(QString::fromUtf8("images/previous_disabled.png")), QIcon::Normal, QIcon::Off);

pushButton_6->setIcon(icon_previous);

}

label_3->setText(files[file_count]);

}

}

void MPlayer::next_slots()

{

if(file_count < (files.size()-1))

{

if(file_count == 2)

{

QIcon icon_previous;

icon_previous.addPixmap(QPixmap(QString::fromUtf8("images/previous_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton_6->setIcon(icon_previous);

}

process->write("quit ");

process = new QProcess(this);

connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots()));

file_count++;

if(!isStop)

{

file_name = files[file_count];

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());

process->start(common);

}

if(file_count == (files.size()-1))

{

QIcon icon_next;

icon_next.addPixmap(QPixmap(QString::fromUtf8("images/next_disabled.png")), QIcon::Normal, QIcon::Off);

pushButton_7->setIcon(icon_next);

}

}

label_3->setText(files[file_count]);

}

void MPlayer::seek_slots(int seek_num)

{

qDebug()<

if(process && process->state() == QProcess::Running )

{

process->write(QString("seek " + QString::number(qMin(seek_num,100)) + "1 ").toAscii()); }

}

void MPlayer::get_time_slots()

{

if(isPlay)

]{

p

rocess->write("get_time_pos ");

process->write("get_time_length ");

}

}

void MPlayer::set_volume_slots(int volume)

{

qDebug()<

process->write(QString("volume +" + QString::number(volume) + " ").toAscii());

//process->write(QString("volume +1 ").toAscii());

}

void MPlayer::set_sound_slots()

{

if(isSound)

{

process->write("mute 1 ");

QIcon icon_sound;

icon_sound.addPixmap(QPixmap(QString::fromUtf8("images/nosound_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton->setIcon(icon_sound);

isSound = false;

}

else

{

process->write("mute 0 ");

QIcon icon_sound;

icon_sound.addPixmap(QPixmap(QString::fromUtf8("images/sound_enabled.png")), QIcon::Normal, QIcon::Off);

pushButton->setIcon(icon_sound);

isSound = true;

}

}

void MPlayer::playerReward_slots()

{

//bool ok;

//int m=moviePosition.toInt(&ok);

if (process && process->state()==QProcess::Running && !isPlay)

{

//QString cmd="seek "+QString::number(qMax(m-10,0))+" 1 ";

//process->write(cmd.toAscii());

qDebug()<<"Reward";

}

}

void MPlayer::playerForward_slots()

{

// groupBox->setVisible(false);

//bool ok;

//int m=moviePosition.toInt(&ok);

/* if (process && process->state()==QProcess::Running && !isPlay) {

//QString cmd="seek "+QString::number(qMin(m+10,100))+" 1 ";

//process->write(cmd.toAscii());

qDebug()<<"Forward";

}*/

}

void MPlayer::back_message_slots()

{

while(process->canReadLine())

{

QString message(process->readLine());

QStringList message_list = message.split("=");

if(message_list[0] == "ANS_TIME_POSITION")

{

curr_time = message_list[1].toDouble();//toInt();

QTime time = int_to_time(curr_time);

label->setText(time.toString("hh:mm:ss"));

horizontalSlider->setValue(100 * curr_time / file_length);

}

else if(message_list[0] == "ANS_LENGTH")

{

file_length = message_list[1].toDouble();//toInt();

QTime time = int_to_time(file_length);

label_2->setText(time.toString("hh:mm:ss"));

}

}

}

QTime MPlayer::int_to_time(int second)

{

int sec = 0, min = 0, hour = 0;

QTime time;

if(second < 60)

{

sec = second;

min = 0;

hour = 0;

}

if(second >= 60 && second < 3600)

{

sec = second % 60;

min = second / 60;

hour = 0;

}

if(second >= 3600)

{

sec = second % 60;

min = (second / 60) % 60;

hour = second / 3600;

}

time.setHMS(hour,min,sec);

return time;

}

image.qrc

images/player_play.png

images/player_stop.png

images/player_pause.png

images/play_enabled.png

images/pause_enabled.png

images/reward_enabled.png

images/forward_enabled.png

images/stop_enabled.png

images/sound_enabled.png

images/nosound_enabled.png

images/previous_enabled.png

images/previous_disabled.png

images/next_enabled.png

images/next_disabled.png

(3)编译工程

l 拷贝qmake到当前工程目录下

#cp /home/linux/Qtopia/target/qtopiacore/host/bin/qmake ./

l 生成项目文件、

#qmake –project

l 生成Makefile

#qmake

l 编译

#make

成功后,可以生成mplayer可执行程序

l 建立movie和images

#mkdir movie

#mkdir images

[root@localhost mplayer]# ls movie/

1.mp3

2.avi

3.avi

4.avi

5.avi

[root@localhost mplayer]# ls images

forward_enabled.png nosound_enabled.png player_play.png reward_enabled.png images pause_enabled.png player_stop.png sound_enabled.png next_disabled.png play_enabled.png previous_disabled.png stop_disabled.png

next_enabled.png player_pause.png previous_enabled.png stop_enabled.png

l 运行程序

[root@localhost mplayer]#./mplayer

五、移植到ARM平台过程

1、内核要求

要求内核支持framebuffer驱动、OSS音频驱动、支持input事件的触摸屏驱动。

2、目标板上部署qt环境

将前面交叉编译好的/Qtopia目录拷贝到nfsroot目录下

#cp /Qtopia /rootfs –a

注:rootfs为目标平台的nfs根文件系统位置

3、文件系统中移植tslib

(下面的步骤是在ubantu-8.10环境下编译的,其它的系统基本相同)

(1)拷贝―项目代码\tslib源码‖目录下的tslib-1.4.tar.gz到linux系统

(2)# tar -zxvf tslib-1.4.tar.gz

# cd tslib-1.4

# ./autogen.sh

这一步需要安装一些工具,如:在ubantu系统下可以执行:sudo apt-get install automake (3)执行autogen.sh脚本所生成的Makefile文件

请打入以下命令:

echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache

./configure --host=arm-softfloat-linux-gnu --prefix=/home/linux/tslib --cache-file=$ARCH-linux.cache

--host是指你的交叉编译器的前最;例如:你的交叉编译器是arm-linux-gcc,则--host=arm-linux.如果是arm-softfloat-linux-gnu-gcc

则--host=arm-softfloat-linux-gnu

--prefix 是你执行make install 的时候编译后生成的可执行文件和库文件以及配置文所安装的目录;

configure文件下还有好多选项,你可以执行./configure --help 来进行选择其他项,不过在这

里这些选项就够了。

(4)#make

#make install

(5)把指定安装目录下的mytslib的文件都copy到你所挂载的根文件下

#cp -rf /home/linux/tslib/* /rootfs/tslib

(6)修改/rootfs/tslib下的etc目录中ts.cong文件

#vi ts.conf 将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误

(7)启动你的开发板

在终端上设置一下环境变量:

export TSLIB_ROOT=/mytslib

export TSLIB_TSDEVICE=/dev/event0

export LD_LIBRARY_PA TH=/mytslib/lib:$LD_LIBRARY_PA TH

export QWS_SIZE=320x240

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_PLUGINDIR=/mytslib/lib/ts

export TSLIB_CONSOLEDEVICE=none

export TSLIB_CONFFILE=/mytslib/etc/ts.conf

export POINTERCAL_FILE=/etc/pointercal

export QWS_MOUSE_PROTO=Tslib:/dev/event0

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"

export TSLIB_TSEVENTTYYPE=H3600

为了实现Tslib的正确运行,需要对如下的Tslib的环境变量进行配置:

TSLIB_TSDEVICE //触摸屏设备文件名。

TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate校准程序生成。

SLIB_CONFFILE //配置文件名。

TSLIB_PLUGINDIR //插件目录

TSLIB_CONSOLEDEVICE //控制台设备文件名

TSLIB_FBDEVICE //设备名

以上环境变量在实际开发中的实际配置可以根据实际情况决定。而这些指定的设备节点一定要和你的开发板上的/dev目录下的设备节点相对应。

为了不浪费时间我们把上面的这些设置写入一个脚本里面:参见5.6节

(8)就可以运行mytslib/bin下的测试文件,如ts_calibrate校准程序。

4、文件系统中移植mplayer播放器

需要在目标板上也移植开源的mplayer播放器,步骤如下:

l 编译libmad

重新配置前面针对主机编译过的libmad

#./configure --enable-fpm=arm --host=arm-linux --disable-shared \

--disable-debugging --prefix=/usr/local/arm/3.4.1/lib \

CC=arm-linux-gcc

#make

就可以编译出libmad了。注意--prefix配置选项表示libmad库和头文件在哪个目录生成,比如本例中make install后在/usr/local/arm/3.4.1/lib目录下就多了include和lib两个目录。这与

mplayer的配置选项--with-extraincdir指定的目录是相符的。如果没找到编译生成的lib库和include头文件。则在当前编译目录下的mad.h以及.libs目录下的libmad.a拷到你自己指定的目录下

l 编译mplayer

./configure --cc=arm-linux-gcc --host-cc=gcc --target=arm-linux --enable-static \

--prefix=/tmp/mplayer-rc2 --disable-win32dll --disable-dvdread \

--enable-fbdev --disable-mencoder --disable-live --disable-mp3lib \

--enable-mad --enable-libavcodec_a --language=zh_CN \

--disable-armv5te --disable-armv6 \

--with-extraincdir=/usr/local/arm/3.4.1/lib/include \

--with-extralibdir=/usr/local/arm/3.4.1/lib/lib

几点注意:—host-cc参数指定X86的gcc,不指定的话,有些必须用gcc编译的,make会交叉编译,就会出错

--cc指定交叉工具链名称

--with-extraincdir与--with-extralibdir指定刚才交叉编译libmad生成的mad.h与liblibmad.a存放路径

编译过程中会出现如下错误:

armv4l/dsputil_arm_s.S:79:error:selected processor does not support 'pld[r1]'

【解决办法】

修改dsputil_arm_s.S,在前面添加上:

#ifndef HA VE_PLD

.macro pld reg

.endm

#endif

5、主机交叉编译工程

(1)针对目标平台调整UI

由于目标平台的液晶是320*240分辨率的,所以需要调整下UI的大小。将UI的整个窗口大小调整为320*240。

(2)交叉编译工程

l 拷贝针对目标平台的qmake工具到工程目录下

#cp /home/linux/Qtopia/target/qtopiacore/target/bin/qmake ./

l 生成项目文件

#qmake –project

l 生成Makefile文件

#qmake

l 编译生成目标文件mymplayer

#make

6、设置环境变量脚本文件Qtopia.sh

#vim Qtopia.sh

!/bin/sh

export TSLIB_ROOT=/tslib

export TSLIB_TSDEVICE=/dev/event0

export LD_LIBRARY_PA TH=/tslib/lib:$LD_LIBRARY_PA TH

export QWS_SIZE=320x240

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_PLUGINDIR=/tslib/lib/ts

export TSLIB_CONSOLEDEVICE=none

export TSLIB_CONFFILE=/tslib/etc/ts.conf

export POINTERCAL_FILE=/etc/pointercal

export QWS_MOUSE_PROTO=Tslib:/dev/event0

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_TSEVENTTYYPE=H3600i

export LD_LIBRARY_PA TH=/Qtopia/lib:$LD_LIBRARY_PATH

export QWS_SW_CURSOR

export set HOME=/root

export set QPEDIR=/Qtopia

export set QWS_KEYBOARD="TTY:/dev/tty1"

export QWS_DISPLAY="LinuxFb:mmWidth60:mmHeight65:0"

7、通过nfs方式测试程序

(1)设置uboot参数

setenv bootcmd tftp 30008000 zImage \; go zImage

setenv bootargs root=nfs nfsroot=192.168.1.112:/rootfs ip=192.168.1.202 init=/linuxrc console=ttySAC0,115200 devfs=mount display=sam240

(2)启动目标系统

l 将―项目代码\工程镜像‖目录下的zImage拷贝到tftp服务目录/tftpboot下

l 开启nfs、tftp服务,服务目录分别为/rootfs /tftpboot

l 启动系统

l 运行测试程序

#. ./Qtopia.sh //设置环境变量

#cd mymplayer

#./mymplayer –qws //运行程序

8、QT程序国际化

利用/home/linux/Qtopia/target/qtopiacore/host/bin下面的几个工具给程序做汉化工作

(1)修改pro文件

在.pro文件添加如下内容:

TRANSLATIONS = zh_CN.ts

(2)生成ts文件

#lupdate mymplayer.pro

生成zh_CN.ts文件

(3)生成qm翻译文件

#linguist zh_CN.ts

(4)拷贝字体文件到目标系统

l 从C:\WINDOWS\Fonts选择一个字体,如simsun.ttc

cp simsun.ttc /rootfs/Qtopia/lib/fonts //simsun.ttc 是宋体字库

l 修改fonts中文件fontdir,添加如下内容

simsun simsun.ttc TTC n 50 120 u

(5)修改源码

修改main.cpp为如下形式

#include

#include "mplayer.h"

#include

#include

int main(int argc, char **argv)

{

QApplication app(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")) ;//设置编码为UTF8 app.setFont(QFont("simsun", 10)); //设置显示字体为汉字QTranslator *translator = new QTranslator( 0 ); //导入中文化qm文件

translator->load( "zh_CN.qm", "." );

app.installTranslator( translator );

MPlayer player;

player.show();

return app.exec();

}

9、目标机独立测试

(1)裁剪系统

(2)制作cramfs镜像

音乐播放器实习报告

武汉工程大学 计算机科学与工程学院认识实习报告 专业计算机科学与技术 班级 学号 学生姓名 指导教师陈艳(讲师) 2014~2015学年第1学期实习时间 2014.9.1至2014.9.5 实习成绩 武汉工程大学计算机科学与工程学院制

说明: 1、实习指导教师由学院校内教师担任,负责组织实习、学生管理、参加实 习答辩、实习成绩评定、给出实习评语等工作。 2、实习报告由武汉工程大学计算机科学与工程学院提供基本格式(适用于 学院各专业),各专业教研室和指导教师可根据本专业特点及实习内容做适当的调整,学生须按指导教师下达的实习报告格式认真进行填写。 3、实习成绩由指导教师根据学生的实习情况给出各项分值及总评成绩。 4、指导教师评语一栏由实习指导教师就学生在整个实习期间的表现给出客 观、全面的评价,包括实习期间的表现、实习报告的质量等。 5、实习报告正文字数应不少于5000字,实习日记字数不少于300字/天。 6、实习报告正文中实习目的与任务、实习地点、实习内容和要求等项,可 由指导教师统一给出。

认识实习成绩评定表学生姓名:学号:班级:

指导教师评语

一、实习目的与任务 认识实习是信息技术专业学生在完成基础课学习转入到专业课学习阶段的一个极其重要的实践教学环节。其目的是通过实地参观和听取专业报告等多种方式,使学生进一步了解本专业及相关领域的发展现状,以及相关产品的研发过程和管理手段。通过实习,使学生通过软件开发的实践训练,进一步掌握设计开发软件的方法与技术,学会数据的组织方法,提高软件开发的实际能力,培养创造性的工程设计能力和分析、解决问题的能力。 具体的任务包括: 1.深化已学的理论知识,完成理论到实践的转化,让学生对软件开发领域的最新技术有本质的了解,并能熟练运用。通过电子商务网购平台的研发,让学生熟练操作各种开发平台,并能按照CMM3规范,和软件开发的流程开发一个小型项目; 2.提高分析和解决实际问题的能力,让学生有高质量的就业IT行业的机会。培养“开拓创新”能力。大力提倡和鼓励在开发过程中使用新方法、新技术,激励学生实践的积极性和创造性,开拓思路,设计新算法、新创意,培养创造性的工程设计能力。 3.了解信息技术产品的研发过程、信息系统的设计、信息系统的技术与管理等专业知识;了解计算机、通信等相关领域的发展现状和最新的科研成果,及在生产科研中的应用;巩固学生的理论知识,培养学生的实践能力、创新能力,拓宽学生视野,树立努力学习专业知识的信心,并为学习后续课程打下一定的实践基础; 4.增强劳动观念,树立正确的劳动观和价值观。 二、实习地点 软帝(Ruandy)信息科技有限公司,武汉光谷金融港 三、实习内容和要求 本次实习在软帝信息科技有限公司的实习基地进行。要求学生在5天的实习期间,在教师的指导下熟悉Java Android开发平台,掌握APP开发的基本方法和技巧,完成一个小型APP的设计和开发。 四、实习总结及分析 1)、搭建Android开发环境 Android需要运行环境才能够运行,下面介绍Android的开发环境配置。搭建开发环境需要的软件: 1.操作系统:Windows XP; 2.软件包:Android SDK(Software Development kit Java Development kit) 、ADT(Android Development Tool) 3.IDE环境:Eclipse IDE+ADT Eclipse3.3以上

Java音乐播放器源代码即结果显示

简单的音乐播放器一、程序代码: import java.io.File; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.FileDialog; import java.awt.Frame; import java.awt.GridLayout; import https://www.360docs.net/doc/9d1933268.html,bel; import java.awt.List; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.MenuShortcut; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; public class Example extends Frame { private static final long serialVersionUID = 1L; boolean isStop = true;// 控制播放线程 boolean hasStop = true;// 播放线程状态

自己写的音乐播放列表生成工具PlaylistMaker

自己写的音乐播放列表生成工具PlaylistMaker 从,与黑莓自带的音乐播放器比较有好处也有缺点,下面粗略的作了一下比较: multiPlay 优点:可以创建播放列表,能整个目录添加文件;在待机模式可以播放。 缺点:不支持wma等格式;播放列表不能改名,也不支持中文,只能有一个播放列表;打不开m3u播放列表。 KD_Player_8800_8300 优点:可以创建播放列表,列表名可以支持中文也可以改名,能整个目录添加文件;在待机模式可以播放;支持wma等格式。 缺点:播放列表不能保存;打不开m3u播放列表。 黑莓自带音乐播放器 优点:可以创建播放列表,列表可以保存,支持中文,可以打开m3u播放列表;支持wma等格式。 缺点:在待机模式不能播放;播放列表不能整个目录添加文件,添加文件很麻烦。 总结以上的优缺点,本人觉得使用黑莓自带的音乐播放器再加上离线生成播放列表工具,应该比其它两个工具好用得多。 因此我抽了点时间完成了播放列表的离线生成工具,如下图:

原理:黑莓m3u播放列表文件里的中文只能用UTF-8来编码,而且需要象URI 一样转义才能正确读取。 功能: 1. 支持添加目录和添加文件,支持拖放目录或文件到列表中(注:没过滤同名文件,即一个文件添加多少次就有多少份)。 2. 列表中的内容可以正向/反向排序,生成时按列表中文件的顺序创建播放列表。 3. 可以单独复制音乐文件所在文件夹到剪贴板,常用于粘贴成列表名。 4. 在指定目录下生成指定列表名的播放列表,后缀.m3u。 注意.m3u中文件前缀的指定,可以用黑莓自带的音乐播放器添加一个新的播放 列表,然后把手机连上电脑,在“BlackBerry\music”目录下打开刚添加的播放列表,用记事本打开,如果是以下格式: 那“/BlackBerry”前面的内容就是文件前缀,如果不是“ 下图是我在本机看到的用这个工具生成的列表:

音乐播放器设计文档

生产实习报告 题目:音乐播放器 学生姓名:张凡 学号: 201220220123 班级: 1222201 专业:数字媒体技术 指导教师:张金 2015年08 月08日

目录 一、引言 (3) 1.1 项目背景 (3) 1.2 项目研究的目的 (4) 1.3 安卓简介 (4) 二.功能分析 (5) 2.1 功能需求分析 (5) 2.2 系统性能需求 (6) 2.3 运行环境需求 (6) 三.程序详细设计 (6) 3.1 主界面的设计 (6) 3.2 播放界面设计 (11) 3.3 其他功能 (14) 四.调试与运行 (18) 4.1 调试 (18) 4.2 运行结果 (19) 五.总结 (21)

一、引言 1.1 项目背景 当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,symbian,Windows mobile,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?答案是:肯定的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。 随着计算机的广泛运用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。针对以上各种弊端,选择了开发多语种的音频视频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户(如听歌,看电影)的需求,除了能播放常见格式的语音视频文件,高级功能:还能播放RMVB格式的视频文件。此外,还能支持中文、英文等语言界面。

音乐播放器的设计与实现设计共19页文档

目录 一、前言 (1) 二、系统分析 (2) (一)系统需求分析 (2) (二)系统功能需求分析 (2) (三)业务流程分析 (3) 三、系统设计 (4) (一)总体设计 (4) (二)歌曲列表模块设计 (4) (三)播放控制模块设计 (4) (四)播放器设置模块设计 (4) (五)数据库设计 (4) 四、系统实现 (6) (一)主界面 (6) (二)播放列表 (12) (三)歌词显示界面 (13) (四)皮肤更换 (15) 五、软件测试 (16) (一)软件的测试 (16) (二)功能的测试与实现 (16) (三)测试结论 (17) 六、结论 (17) 参考文献 (18)

Android音乐播放器的设计与实现 (电子信息工程系软件技术111班王永军) 摘要:本论文的音乐播放器采用了Android开源系统技术,利用Java 语言和Eclipse开发工具对播放器代码进行编写。同时给出了详细的系统设计过程、部分界面截图及主要的功能流程图,该音乐播放器集播放、暂停、停止、上一首、下一首、歌词显示等功能于一体,性能良好,在Android系统中能独立运行。实验证明,基于android平台的软件开发简单,使用方便简洁,必将成为未来几年的发展方向,具有普遍意义。 关键词:Android;Java;Eclipse;音乐播放器 一、前言 当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,是的手机操作系统也出现了不同各类,现在的市场主要有三个手机操作系统,Windows mobile,苹果系统,以及谷歌的Android操作系统,其中占有开发源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。 随着计算机的广泛运用,手机市场的迅速发展,各种音频资源也在网上广为流传,这些资源卡是平常,但已经渐渐成为人们生活中必不可少的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味最求外观花俏,功能庞大,对用户的手机造成很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。针对以上各种弊端,选择了开发多语种的音频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户听歌的需求。 现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计的实现的这主要功能是播放MP3等音乐文件,并且能够控制播放器播放,暂停,停止,上一曲,下一曲。界面简单,操作简单。 本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的播放

音乐播放器设计文档

题目:心灵音乐播放器学号: 姓名: 学院:信息工程学院 专业班级: 指导教师: 设计时间:2012年4月至2012年5月

目录 第一章引言 (3) 1.1 项目背景 (3) 2.2 编写目的 (3) 第二章系统开发 (4) 2.1 功能需求(用例图分析) (4) 2.1.1 播放器的基本控制需求 (4) 2.1.2 播放清单列表管理需求 (5) 2.1.3 播放友好性需求 (6) 2.1.4 播放扩展卡需求 (6) 2.1.5 功能需求(时序图)分析................................................... 错误!未定义书签。 2.2 系统结构图和流程图 (6) 2.2.1 音乐播放器的系统流程图 (6) 2.2.2 系统功能表(表2.1)和系统功能结构图(图2.5.2) (7) 2.3 详细设计 (8) 2.3.1 文档结构 (8) 2.3.2 类结构 (9) 2.4 初步设计界面图 (10) 2.4.1 在线列表 (11) 2.4.2 下载器界面 (11) 2.4.3 播放器界面 (12) 2.4.4 音乐设置界面 (13) 2.4.5 默认本地音乐文件夹界面 (14) 2.4.6 单击某条记录弹出对话框 (15)

摘要 Android是一个开源系统技术,它底层是基于Linux操作系统,本音乐播放器采用了Android开源系统技术,利用Java语言和Eclipse编辑工具对播放器进行编写。同时给出了详细的系统设计过程、部分界面截图以及主要功能运行流程图,还对开发过程中遇到的问题和解决方法进行了详细的讨论。该音乐播放器集播放、暂停、停止、上一首、下一首、音量调节、歌词显示、在线播放、音乐下载等功能于一体,性能良好,在Android系统中能独立运行。MP3的全名是MPEG Audio Layer-3,是一种声音文件的压缩格式,由于本播放器只限于应用层的探讨,所以对具体的压缩算法不作深究 关键词:Android;开源系统;Linux;音乐播放器 第一章引言 1.1 项目背景 当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同种类,现在市场上主要有三个手机操作系统——Windows Mobile,Symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上又有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的音乐播放器。 2.2 编写目的 现金社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,可以播放本地的MP3音乐,也可以播放在线的MP3音乐。本设计所实现的主要功能是播放MP3音乐文件,并且能够控制播放,暂停,停止,上一曲,下一曲,音量调节,视觉外观,播放列表和歌曲文件管理操作等多种播放控制功能,界面简明,操作简单。 本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使本人更加熟练Android的技术和它在市场上的特点。

音乐播放器开发模块

音乐播放器开发文档 1.动能介绍 开始菜单包含:a.添加音乐文件b.添加音乐文件夹c.添加背景图片d.退出播放模式:a.单曲循环 b.顺序循环 c.列表播放 d.随机播放 透明度:透明百分之几或不透明 界面设置:迷你模式 关于:版本信息 2、代码讲解 全局变量:private SoundPlayer Player = new SoundPlayer(); private SoundPlayer SencondPlayer = new SoundPlayer();

Image[] image = new Image[500];//存放图片数组 private int Imagecount = 0;//计算背景图片数 private int order = 0;//存储图片总数 private int fileCount = 0;//数组中计算音乐文件数 private int fileCount1 = 0;//文件系数 string[] musicfile = new string[500];//存放音乐文件 int selectOne = 0;//双击事件选择的音乐的序号 static int stop = 2;//判断是暂停还是播放 static double CurrentPosition = 0;//获得文件播放的位置 static int State = 0;//当前状态等于时进行单曲循环,等于零的时候进行顺序播放,//当前状态等于时为随机播放//当前状态等于时为列表播放 OpenFileDialog openfile = new OpenFileDialog();//打开本地磁盘对话框 添加音乐文件 private void添加文件ToolStripMenuItem1_Click(object sender, EventArgs e) { fileCount1++; openfile.Filter = "|*.mp3"; openfile.Multiselect = true;//支持多行文件 try { if (DialogResult.OK == openfile.ShowDialog()) { musicfile[fileCount] = openfile.FileName; FileInfo fileinfo = new FileInfo(musicfile[fileCount]);

音乐播放器Java课程设计报告

《JA V A程序设计》课程设计报告题目:音乐播放器 学院:计算机科学与工程学院 专业:信息管理与信息系统 学生姓名:杨柏昌 学号:1400320228 指导老师:汪华登

目录 1. 概要设计.................................................................... 2. 详细设计.................................................................... 3. 测试............................................................................ 4. 总结............................................................................

概要设计 播放器主要使用JMF框架实现,播放器界面如下

详细设计package design.curriculum.JAVA; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.Border; import java.io.*; import javax.media.*; public class JMFPlayer extends JFrame implements ActionListener,ControllerListener{ Player player=null;//声明一个Player对象 String filePath;//存放音乐文件夹所在目录 String fileName;//存放歌曲名称 boolean click=false;//用来标记歌曲是否被点击 int songIndex;//歌曲元素在列表中的位置 int loop=3;//作为播放模式的标记 JLabel songNameLable; JRadioButton sequenceBtn; JRadioButton singleBtn; JRadioButton randomBtn; ButtonGroup loopGroup; JButton beforeBtn; JButton nextBtn; JButton playBtn; JButton pauseBtn; JButton stopBtn; JButton fileBtn; JButton exitBtn; Component controlComponent;//player的控制面板Container container; JPanel songNamejp; JPanel loopjp; JPanel btnjp; JPanel listjp; JPanel btn2jp; List list; public JMFPlayer(){ super("音乐播放器"); setBounds(480,50,400,600); setResizable(false);//设置界面不可修改

基于QT的音乐播放器编程

1.新建工程,基类选择Qwidget。双击打开界面文件,在界面文件中创建label 显示时间、若干个toolbutton按钮和一个listWidget列表显示歌曲列表。点击“文件”->“新建”创建QT资源文件,在工程目录下建文件夹“images”,双击QT资源文件添加前缀“/”,再添加图标文件。 2.单击上一曲按钮,在属性栏设置标题tooltip和图标icon: 界面如下: 3.右键几个按钮,转入槽函数,列表和歌词的信号选择clicked(bool)。 4.工程文件中添加语句 QT+=phonon 对音乐播放器进行设计,主要用到模块中的MediaObject (管理媒体源)AudioOutput (连接物理设备)SeekSlider(实现进度条)QList (实现播放

列表) 大概地说,Phonon 的工作机制是使用MediaObject 来管理MediaSource 即源文件,通过Path 连接到AudioOutput ,最后是由AudioOutput 将数据发送到相关物理设备。 5.修改widget.h头文件 在widget.h头文件添加语句: #include 在头文件声明变量: private: Phonon::MediaObject*audio;//管理媒体源 Phonon::MediaObject*musicInformationMediaObject;// Phonon::VideoWidget*videoWidget;// Phonon::AudioOutput*audioOutput;//连接物理设备 Phonon::SeekSlider*seekSlider;//实现进度条 Phonon::VolumeSlider*volumeSlider;//音量调节 QListsourceList;//播放列表 QTimer*timer; QIcon*iconplay; QIcon*iconpause; QAction*play; QAction*stop; QAction*open; QAction*sound; QAction*exit; QAction*remove; 头文件声明函数: public: void creatActions();//创建动作 6.修改widget.cpp文件 构造函数添加: this->setWindowTitle(tr("音乐播放器"));//设置标题 /**初始化媒体**/ audio=new Phonon::MediaObject();//媒体对象 audio->setTickInterval(1); audioOutput=new Phonon::AudioOutput(Phonon::VideoCategory);//音频输出 Phonon::createPath(audio,audioOutput);//连接媒体对象与音频输出 musicInformationMediaObject=new Phonon::MediaObject(this);//音乐信息对象 volumeSlider=new Phonon::VolumeSlider(audioOutput,this);//音量滑动条

Android音乐播放器开发文档

多媒体综合课程设计报告 课题名称:ANDROID音乐播放器 姓名:杨超 学号:2823102012 2011年10月31日

目录 1需求分析................................... 错误!未定义书签。 1.1问题定义..................................................................................................... 错误!未定义书签。 1.2 可行性研究........................................................................................... 错误!未定义书签。 1.3 需求分析............................................................................................... 错误!未定义书签。 1.4总体设计 .................................................................................................... 错误!未定义书签。 2. 概要设计................................. 错误!未定义书签。 2.1引言 (6) 2.1.1................................................................................................................................ 编写目的6 2.1.2....................................................................................................................................... 背景7 2.1. 3................................................................................................................................ 术语定义7 2.1.4................................................................................................................................ 参考资料7 2.2总体设计 (7) 2.2.1 ....................................................................................................................... 总体技术框架7 2.2.2 ................................................................................................................ 需求与设计对应表7 2.3功能设计................................. 错误!未定义书签。 2.3.1................................................................................................................................ 音乐播放错误!未定义书签。 2.3.2................................................................................................................................ 后台运行错误!未定义书签。 2.3.3...................................................................................................................... 读取SD卡……错误!未定义书签。 2.3.4.......................................................................................................................... 歌词同步……错误!未定义书签。 2.3.5.......................................................................................................................... 手势换歌……错误!未定义书签。 2.4接口设计 (8) 2.5部署与组件设计 (8) 2.5.1................................................................................................................................ 部署模型8

基于mfc音乐播放器的设计与实现(含源文件)

毕业设计(论文) 题目音乐播放系统设计专业信息与计算科学 年级 2009级1班 学号xxxxxxxxxx 姓名xxxxx 指导教师xx 完成时间:

目录 摘要................................................................................................................I Abstract ..........................................................................................................I I 1 前言 (1) 1.1软件开发背景及意义 (1) 1.2发展现状及趋势 (1) 1.3主要研究方法及过程 (2) 2 相关技术简介 (2) 2.1 VC技术应用的基本现状 (2) 2.2 MCI命令接口编程 (2) 2.2.1 MCI命令 (3) 2.2.2 MCI命令消息接口方式 (4) 2.2.3 MCI命令字符串接口方式 (7) 3需求分析 (8) 3.1功能需求 (8) 3.1.1 播放器的基本控制需求 (8) 3.1.2功能需求分析 (8) 3.2 运行及其它需求分析 (9) 3.3 可行性分析 (9) 4 软件结构及界面设计 (10) 4.1软件结构设计 (10) 4.2 GUI界面设计 (10) 5详细设计 (11) 5.1文件菜单下的详细设计 (11) 5.1.1打开文件设计 (11) 5.1.2 打开文件夹设计 (13) 5.2播放音乐的详细设计 (13) 5.3播放列表的详细设计 (14) 5.4歌词显示的详细设计 (15) 5.5播放器优化的详细设计 (15) 6结论 (17) 参考文献 (18) 致谢 (19)

Android音乐播放器开发文档

Android音乐播放器 撰写人:张XX 2011-3-15 一、问题定义 本软件是为了用户智能手机Android而开发的一套智能软件,提供在线下载音乐,在线播放音乐,读取SD卡音乐文件等功能。 二、可行性研究 社会可行性分析:3G技术飞速发展,为满足人们对音乐的追求,音乐播放器层出不从,然而市面上大多音乐播发器软件都太难操作,或者音质不好,不能给用户以更好体验,故提出开放一套更加人性化的手机播放器。 技术可行性分析:以现阶段android技术发展水平,技术人员的技术配备,以及现有资源文档的配备来说,实现本软件是可能的。 经济可行性分析:有本人个人时间以及经费支持,使得开发此软件有了资金保障,可以充分利用这一优势,尽快开发。 其他可行性分析: 三、需求分析 随着3G时代的到来,手机应用越来越普遍,加之国民手机持有量更是爆炸式增长。移动音乐服务正是为这一形势而发展起来,本人提出一种多功能手机音乐播放器的应用,主要为了满足不同人群的音乐需要,并且提高优质的音乐服务,于是提出本音乐播放器的主要功能。 需求功能如下:

在线下载音乐功能。 在线播放音乐 显示声音波段表示 提供读取SD卡音乐 用户可以定制音乐均衡器,以满足不同音质需求音量调节 提供歌词跟随音乐滚动更能 提供重力感应选择上、下首歌曲功能 四、概要设计(总体设计):

软件程序流程图 五:详细设计 那么接下来就开始我们的每一个模块的详细设计了:

在线下载音乐: 提供一个文本框供用户输入网络音乐文件地址,然后确定下载,并提供进度条显示,下载完毕后关闭对话框,注意进程之间的问题。 在线播放音乐 提供音乐播放的基本功能,快进,暂停,播放,快退,同时进度滑块条需跟随滑动,用户也可以滑动滑动条进行调整播放位置。 提供读取SD卡音乐 检测用户SD卡,如果没有,则弹出信息提示,并提示用户下载网络音乐,如果检测有SD卡,则再遍历是否有可播放文件,如果没有,则返回。如果有,则显示出全部音乐文件,并提供点击播放功能。 用户可以定制音乐均衡器,以满足不同音质需求 以一个对话框形式表现出,并提供多项滑动条供用户调节音频,同时更新音乐播放的质量。 音量调节提供 提供滑动条供用户调节音量,音量范围在0—100之间 提供歌词跟随音乐滚动更能 解析LRC歌词文件,并同步歌词已经播放声音,注意以多线程方式以及解析xml 方式处理 提供重力感应选择上、下首歌曲功能 根据系统自带API开启重力感应功能,同时根据感应的方向选择切换到上下不

音乐播放器需求分析

音乐播放器需求分析 姓名:葛建豪 班级:计算机131 院:信息与网络工程学院 1.引言 1.1 编写目的 1.2 项目背景 1.3 参考资料 2.总体概述 2.1 项目目的和目标 2.2 软件运行环境 2.3 条件与限制 3.具体需求 3.1功能需求 3.2界面需求 3.3性能需求 3.5数据库需求 3.6可靠性要求

1.引言 音乐的魅力在生活中是极其大的,不同的国家、不同语言的人,可以从音乐中体会到相同的情感,可以加强人与人之间的联系,我们也可以从音乐中了解他国,因为音乐是人类共同的食粮,它也可以可以让身体放轻松,纾解压力,避免因自律神经紧张失调而导致慢性疾病的产生。可以,纾解忧郁苦闷的心情,甚至可以做到某些程度的心灵治疗。因此为使人们能够随时听到音乐,音乐播放器则应时被创造出来了,它为用户提供了便利,使得人们可以通过手机等设备在任何时候欣赏到音乐,为了使音乐播放器出现,必须依据手机为载体通过设计出一个基于android系统的音乐播放器。 1.1 编写目的 为软件的开发者能更好的理解和明确软件开发的需求,安排项目与进度、组织软件开发与测试,撰写本文档。本文档供项目组成员,软件开发人员参考。 1.2项目背景 本项目自行构思得出,由个人独立编写程序研究。 1.3参考资料 [1]张春田,苏育挺,张静《数字图像压缩编码》清华大学出版社

[2] 重庆大学出版社《软件工程》“软件计划与可行性分析” [3] 靳岩、姚尚明人民邮电出版社《Android开发入门与实践》 2. 总体概述 2.1 项目目的和目标 本项目的目的是开发一个可以播放主流的音乐文本格式的播放器。设计的主要实现功能是播放MP3等格式的音乐文件,并且能控制播放,暂停,停止,音量控制,选择上一曲,选择下一曲,更改皮肤,歌曲列表文件的管理操作,在线播放,读取存储卡播放等多种播放控制,界面简明,操作简单。 2.2 软件运行环境 操作系统:Android手机操作系统 支持环境:Android 2.2 -- 4.0版本 开发环境:Eclipse 7.5 、ADT 1.5 2.3 条件与限制 由于是个人独立开发,知识和能力达不到编写程序的程度。

音乐播放器的详细分析报告

音乐播放器详细设计 1.引言 随着社会的快速发展,现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,音乐成了我们生活工作中的一个重要的部分。而时代的到来,手机移动应用越来越普遍。此文档就是为了能更好地设计出一个基于系统的音乐播放器而编写的。 编写目的 为软件的开发者能更好的理解和明确软件开发的详细过程,安排项目与进度、组织软件开发与测试,撰写本文档。本文档供项目组成员,软件开发人员参考。项目背景 本项目由李雪梅、杨挺等人提出,由本组成员联合开发,实现播放现今流行的音乐等文本格式。 该软件是基于系统的音乐播放软件,并能够与其他音乐播放软件兼容。 参考资料 [] 重庆大学出版社《软件工程》“软件计划与可行性分析” [] 靳岩、姚尚明人民邮电出版社《开发入门与实践》 [] 可行性分析 [] 《音乐播放器需求分析书》 [] 《音乐播放器总体设计说明书》 项目开发计划 实施计划: 阶段名称负责人

在技 术方面,编程知识比较缺 乏,对有些与项目相关的软件 不熟悉,需进行人员的 技术培训(自 学为主),技术难点是数据库 的构架和软件功能的设计。 . 总体设计 项目目的 本项目的目的是开发一个可以播放主流的音乐文本格式的 播放器。设计的主要实现功能是播放等格式的音乐文件, 并且能控制播放,暂停,停止,音量控制,选择上一曲,选择下 一曲,更改皮肤,歌曲列表文件的管理操作,在线播放,读取 存储卡播放等多种播放控制,界面简明,操作简单。 软件系统检测到错误行为时,报告错误,并提示处理操作。 软件运行环境 硬 件:操作系统手机 系统软件: 版本 支撑软件: 、 需求概述 根据项目,我们可以获得项目系统的基本需求,从功能需求、 界面需求、性能需求、可靠性要求四个方面来描述系统的需求, 需求分析 杨挺、李雪梅 总体设计 李雪梅、杨挺 详细设计 李雪梅、杨挺 软件测试 李雪梅、杨挺

Android音乐播放器需求分析

系统需求规格说明书音乐播放器系统

1 引言 1.1 目的 智能手机需要音乐播放器才能播放手机内的音频文件,本软件具备音乐播放器的播放歌曲、歌曲列表、拖动进度等基本功能,同时本播放器界面简洁美观,操作简单便捷。 2 综合描述 2.1 系统背景 说明:介绍系统的预期效果、历史原因。 一款安卓智能手机如果没有音乐播放器那就不能正常的播放音频文件,这将导致手机失去一项很重要的功能。 2.2 问题说明 音乐播放器是手机必不可少的软件之一,是手机播放音乐的工具,一个好的播放器可以给用户一个好的用户体验,简单快捷的操作是一个播放器所必须的。本软件流程图。 2.3系统范围 音乐播放器主要为手机提供播放音频的功能,适合所有喜爱音乐的人群使用。

2.4干系人/用户需要 2.5 功能摘要 2.6 假定和约束 2.6.1运行环境约束 用户

2.7 分工和进度 2.7.1 系统分工 通过功能摘要中给出的功能,组员对这些功能进行分配,通过表格展示。 2.7.2 系统进度 2.8设计约束 (1)软件开发小组提供相应的开发阶段文档,用户提供相适应的行业标准,使软件开发与典型实例考核相结合。 (2)操作员与用户要按照操作规程运行本系统,不得进行恶意破坏性操作。 (3)用户必须提供相关运行软件有效的数据库接口标准,并在改动的过程中及时通知本软件开发商,以保证从中正确读取预决算参数,进行成本预算。

3 具体需求 3.1功能需求 (1)后台播放音频文件 描述:对指定音频文件进行后台播放,当程序被切换后台依旧可以播放。 加工:用户可在播放界面进行播放、暂停、下一曲/上一曲、播放模式切换、进入播放列表、拖动播放进度操作。允许对本模块执行查询功 能。 1)查寻功能:点击播放按钮,获取自定义类Music,该类存储歌曲的本信息。 输出:播放歌曲 界面UI

音乐播放器源代码

P align=center>

autostart="true"中true或1表示自动播放,false或0表示手动播放loop="true" 中的true或1表示重复播放,false或0表示只播放一次 width= height= 中的数字分别表示播放器的宽度和高度=0表示隐藏播放器 EnableContextMenu="0" 禁右键 ShowStatusBar="1" (带显示文件播放信息) ======================================================= 隐藏(hidden=true)播放器(不循环) ----------------------------------------------------------- 隐藏(hidden=true)播放器(循环) --------------------------------------------------------------- 黑色[style="FILTER: xray()"]循环[loop="-1"]播放器 -------------------------------------------------------------------------------- 浅兰色循环(loop="-1")播放器

相关文档
最新文档