目录
一、文档简介:
本文档用于辅助使用者使用mplayer模块进行开发工作。
MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布。目前MPlayer已经支持11种音频格式分别为:wav、wma、wmv、mp3、mp2、ogg、flac、ape、aac、m4r、m4a,支持网络协议分别为:http、mms、rtsp、ftp。
开发环境参数:
操作系统:Ubuntu11.04
本机平台:X86
目标平台:Loongson1B开发板
交叉编译工具链:gcc-3.4.6-2f(1B交叉编译工具链)
所需软件及工具包:
定点mp3解码库libmad源码包:libmad-0.15-ls1b.tar.gz
流媒体支持工具live555源码包:live555-ls1b.tar.gz
Mplayer播放器源码包:mplayer-ls1b-module.tar.gz
二、Mplayer安装编译过程
PS.本次安装过程,假定mplayer的源码包存放于/opt/mplayer/目录
1.安装定点mp3解码库libmad
由于Loongson1B没有浮点运算单元,而mplayer的mp3解码默认使用mp3浮点解码库mp3lib,故而移植mplayer到1B上,需要编译一个定点mp3解码库libmad:
首先请确保1B的交叉编译工具链已经安装到PC上,并将其加入到PATH环境变量中:
#exportPATH=/home/cpu/gcc-3.4.6-2f/bin:$PATH
接下来进行libmad交叉编译过程:
#tarzxvflibmad-0.15-ls1b.tar.gz
#cdlibmad-0.15-ls1b
#./configure--enable-fpm=mips--host=mipsel-linux--disable-shared--disable-debugging--prefix=/opt/mplayer/install/libmadCC="mipsel-linux-gcc"
#make
#makeinstall
执行以上步骤后,即可将libmad安装到/opt/mplayer/install/libmad/
2.安装流媒体支持工具live555
Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码,同时实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。
在Mplayer中需要使用live选项进行编译,则需要先安装live555库,下边是live555库的安装过程:
#tarzxvflive555-ls1b.tar.gz
#cdlive555-ls1b/live/
#cpconfig.armlinuxconfig.mips
#chmod777config.mips
#viconfig.mips
将: CROSS_COMPILE?=arm-elf-
修改为: CROSS_COMPILE?=mipsel-linux-
#./genMakefilesmips
#make
这样就完成了对live555的编译,然后将整个工具包拷贝到指定位置:
#cp../live//opt/mplayer/install/-rf
3.交叉编译Mplayer
首先确认一下定点mp3解码库libmad以及流媒体支持工具live555的安装路径为:/opt/mplayer/install/
由于需要将这两个插件一起编译到mplayer中,所以需要将这两个插件的相关头文件及链接库路径添加到mplayer的编译配置文件中,如下步骤:
#tarzxvfmplayer-ls1b-module.tar.gz
#cdmplayer-ls1b-module
#./config.sh
以上命令为生成默认mplayer编译配置文件config.mak。
#viconfig.mak
对mplayer编译配置文件作以下修改:
File:./config.mak |
#--------Generatedbyconfigure----------- LANG=C MAN_LANG=en TARGET_OS=Linux DESTDIR= #设定makeinstall后mplayer的安装路径,由于安装到本地目录,所以以下目录设定无关紧要 prefix=$(DESTDIR)/opt/mipsel/mplayer/ BINDIR=$(DESTDIR)/opt/mipsel/mplayer//bin DATADIR=$(DESTDIR)/opt/mipsel/mplayer//share/mplayer MANDIR=$(DESTDIR)/opt/mipsel/mplayer//share/man CONFDIR=$(DESTDIR)/opt/mipsel/mplayer//etc/mplayer LIBDIR=$(DESTDIR)/opt/mipsel/mplayer//lib #FFmpeguseslibdirinsteadofLIBDIR libdir=$(LIBDIR) AR=ar #执行config.sh后此处可能被修改成为以下编译工具,但是C++需要的编译工具为g++,若不修改正确则编译出错提示很多未定义 #CC=mipsel-linux-gcc #CXX=mipsel-linux-gcc CC=mipsel-linux-gcc CXX=mipsel-linux-g++ HOST_CC=gcc RANLIB=true LDCONFIG=ldconfig INSTALL=install #设定编译参数:头文件查找路径,设定出错则出现头文件未找到错误 #EXTRA_INC= #EXTRAXX_INC= EXTRA_INC=-I/opt/mplayer/install/libmad/include EXTRAXX_INC=\ -I/opt/mplayer/install/live/liveMedia/include\ -I/opt/mplayer/install/live/groupsock/include\ -I/opt/mplayer/install/live/UsageEnvironment/include\ -I/opt/mplayer/install/live/BasicUsageEnvironment/include OPTFLAGS=-I.-I..-I../libavutil-Wall-Wno-switch-Wpointer-arith-Wredundant-decls-O4-pipe-ffast-math-fomit-frame-pointer-D_REENTRANT-DHAVE_CONFIG_H$(EXTRA_INC) CXXFLAGS=-I.-I..-I../libavutil-Wall-Wno-switch-Wpointer-arith-Wredundant-decls-O4-pipe-ffast-math-fomit-frame-pointer-D_REENTRANT-DHAVE_CONFIG_H-D__STDC_LIMIT_MACROS$(EXTRAXX_INC) CFLAG_STACKREALIGN= INSTALLSTRIP=-s CHARSET= HELP_FILE=help/help_mp-en.h EXESUF= MPLAYER_NETWORK=yes FTP=yes STREAMING_LIVE555=yes LIBNEMESI=no NATIVE_RTSP=yes VSTREAM=no STREAM_CACHE=yes DVBIN=no VIDIX=no VIDIX_INTERNAL=no VIDIX_EXTERNAL=no CONFIG_PP=yes MP3LAME= LIBMENU=no MP3LIB=no LIBWMA=yes LIBA52=no LIBMPEG2=no TREMOR_INTERNAL=yes TREMOR_LOW=no FAAD=yes SPEEX=no MUSEPACK=no UNRARLIB=no PNG=no JPEG=no GIF=no EXTRALIBS= #添加链接库文件及其路径,设定出错则在连接库文件时出现许多函数提示未定义 #EXTRA_LIB=-lmad-ldl-lm EXTRA_LIB=\ -L/opt/mplayer/install/libmad/lib\ -L/opt/mplayer/install/live/liveMedia/\ -L/opt/mplayer/install/live/groupsock/\ -L/opt/mplayer/install/live/UsageEnvironment/\ -L/opt/mplayer/install/live/BasicUsageEnvironment/\ -lmad\ -lliveMedia-lgroupsock\ -lUsageEnvironment-lBasicUsageEnvironment\ -ldl-lm EXTRALIBS_MPLAYER= EXTRALIBS_MENCODER= ... ... |
#make
编译成功后,将会在目录下生成一个mplayer的二进制可执行文件,将其拷贝到开发板的文件系统bin目录,并将需要的链接库文件拷贝到开发板上文件系统的lib目录下就可以运行了。
三、Mplayer的使用方法
1.Mplayer的简单使用
首先看一下mplayer的参数格式:
mplayer[选项][文件|URL|播放列表|−]
mplayer[选项]文件1[分选项][文件2][分选项]
mplayer[选项]{文件和选项组}[组专用的分选项]
mplayer[dvd|dvdnav]://[标题|[开始标题]−结束标题][/设备][选项]
mplayervcd://曲目[/设备]
mplayertv://[频道][/输入ID][选项]
mplayerradio://[频道|频率][/捕捉设备][选项]
mplayerpvr://[选项]
mplayerdvb://[卡号@]频道[选项]
mplayermf://[文件掩码|@列表文件][−mf选项][选项]
mplayer[cdda|cddb]://曲目[−结束曲目][:速度][/设备][选项]
mplayercue://文件[:曲目][选项]
mplayer
[file|mms[t]|http|http_proxy|rt[s]p|ftp|udp|unsv|icyx|noicyx|smb]://
[用户名:密码@]URL[:端口][选项]
mplayersdp://文件[选项]
mplayermpst://主机[:端口]/URL[选项]
mplayertivo://主机/[list|llist|fsid][选项]
mplayer最简单的方法就是mplayer[文件名],即mplayer后边直接传入需要播放的音频或者视频文件。而通过增加一些选项参数,可以设置播放的一些个性化参数,例如声音大小、字幕、循环播放等,这部分的设定,可以在网上很容易查找到资料,或者参考《MPlayer用户中文手册.pdf》。
2.Mplayer的slave模式
默认mplayer是从键盘上获得控制信息,通过键盘按键,可以快捷控制mplayer的播放参数,mplayer另外提供了一种更为灵活的控制方式,用来进行播放控制——slave模式
在slave模式下,mplayer为后台运行其他程序,不再截获键盘事件,mplayer会从标准输入读一个换行符(\n)分隔开的命令。
执行如下命令:
#mplayer-slave-quiet<file>
然后就可以在控制台直接输入slave模式命令进行控制mplayer的播放。
我们也可以通过一个fifo文件(命名管道)进行传递slave命令:
#mkfifo</tmp/fifofile>
#mplayer-slave-inputfile=</tmp/fifofile><file>
对于slave模式的命令这里不作详细说明,可以在《MPlayer用户中文手册.pdf》中查阅相关部分,也可以参考mplayer模块测试例子。
下边主要使用mplayer模块测试例子来介绍如何在程序中通过管道传递slave模式命令给mplayer后台程序:
File:mplayer_test.c |
/* *Copyright(c)2012,广州龙芯中科技术科技有限公司 *Allrightsreserved. * *文件名称:mplayer_test.c *摘要:mplayer模块测试及使用例子 * */ /*当前版本:0.0.1 *作者:Ethan,修改日期:2012年06月18日 */ #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<sys/wait.h> #include<string.h> #include<pthread.h> #include<signal.h> #include"orders.h" #defineMAXLEN1024 #defineIPR_FIFO"/tmp/mplayer-cmd" #defineIPR_FIFO_PARAM"file=/tmp/mplayer-cmd" #defineFILE_PATH"FirstLove.mp3" intfd_pipe[2];//管道文件描述符 /********************************************************************************** *Function(功能):获取mplayer后台程序的打印输出信息 *parameter(参数): *outout(返回值): ***********************************************************************************/ void*get_player_msg() { printf("Get_player_msg:\n"); chardata[MAXLEN]; unsignedintdatalen; while(1) { memset(data,0,sizeof(data)); datalen=read(fd_pipe[0],data,sizeof(data)); printf("%s\n",data); } } /********************************************************************************** *Function(功能):通过管道传递命令给mplayer *parameter(参数):cmd-slave模式命令 *outout(返回值): ***********************************************************************************/ voidmplayer_slave_cmd(char*cmd) { printf("Mplayer_slave_cmd:%s\n",cmd); chardata[MAXLEN]; strcpy(data,cmd); intdatalen=strlen(data); data[datalen++]='\n'; data[datalen]=0; intfp=0; fp=open(IPR_FIFO,O_RDWR); write(fp,data,datalen); close(fp); } /********************************************************************************** *Function(功能):mplayer模块测试及使用例子 *parameter(参数): *outout(返回值): ***********************************************************************************/ intmain() { pid_tpid; pthread_ttid_msg; pthread_mutex_tpmutex; //建立命名管道 unlink(IPR_FIFO); mkfifo(IPR_FIFO,O_CREAT|0666); //建立无名管道用于重定向接收mplayer的后台打印信息 if(pipe(fd_pipe)<0) { perror("pipeerror\n"); unlink(IPR_FIFO); exit(0); } pid=fork(); if(pid<0) { close(fd_pipe[0]); close(fd_pipe[1]); unlink(IPR_FIFO); perror("fork"); exit(0); } if(pid==0) { //标准输出重定向至管道 close(fd_pipe[0]); dup2(fd_pipe[1],1); //启动mplayer程序,为携带文件信息,处于等待命令状态 if(execlp("mplayer","mplayer","-slave","-nocache","-novideo", "-input",IPR_FIFO_PARAM,"-idle","-srate","48000",NULL)==-1) { printf("ERROR:Cannotstartmplayer!!\n"); } printf("MPlayerprogressexit!!\n"); exit(0); } else { //创建线程用以接收mplayer的打印信息 if(!pthread_create(&tid_msg,NULL,get_player_msg,NULL)) { pthread_detach(tid_msg); } else { printf("ERROR:Cannotcreatethreadget_msg_player\n"); } pthread_mutex_init(&pmutex,NULL); } sleep(5); //测试slave模式 //首先传入mp3文件路径,进行音频播放 charcmd[MAXLEN]; sprintf(cmd,"%s%s",ORDER_PLAY,FILE_PATH); mplayer_slave_cmd(cmd); sleep(10); //暂停功能 mplayer_slave_cmd(ORDER_PAUSE); pthread_join(tid_msg,NULL); wait(NULL); return0; } |