目录
一、文档简介:
本文档用于辅助使用者使用mplayer模块进行开发工作。
MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布。目前MPlayer 已经支持11种音频格式分别为:wav、wma、wmv、mp3、mp2、ogg 、flac 、ape 、aac 、m4r 、m4a,支持网络协议分别为: http、mms、rtsp 、ftp 。
开发环境参数:
操作系统:Ubuntu 11.04
本机平台:X86
目标平台:Loongson 1B 开发板
交叉编译工具链: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
由于Loongson 1B没有浮点运算单元,而mplayer的mp3解码默认使用mp3浮点解码库mp3lib,故而移植mplayer到1B上,需要编译一个定点mp3解码库libmad:
首先请确保1B的交叉编译工具链已经安装到PC上,并将其加入到PATH环境变量中:
#export PATH=/home/cpu/gcc-3.4.6-2f/bin:$PATH
接下来进行libmad交叉编译过程:
# tar zxvf libmad-0.15-ls1b.tar.gz
# cd libmad-0.15-ls1b
# ./configure --enable-fpm=mips --host=mipsel-linux --disable-shared --disable-debugging --prefix=/opt/mplayer/install/libmad CC="mipsel-linux-gcc"
# make
# make install
执行以上步骤后,即可将libmad安装到/opt/mplayer/install/libmad/
2.安装流媒体支持工具live555
Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码,同时实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。
在Mplayer中需要使用live选项进行编译,则需要先安装live555库,下边是live555库的安装过程:
# tar zxvf live555-ls1b.tar.gz
# cd live555-ls1b/live/
# cp config.armlinux config.mips
# chmod 777 config.mips
# vi config.mips
将: CROSS_COMPILE?= arm-elf-
修改为: CROSS_COMPILE?= mipsel-linux-
# ./genMakefiles mips
# make
这样就完成了对live555的编译,然后将整个工具包拷贝到指定位置:
# cp ../live/ /opt/mplayer/install/ -rf
3.交叉编译Mplayer
首先确认一下定点mp3解码库libmad以及流媒体支持工具live555的安装路径为:/opt/mplayer/install/
由于需要将这两个插件一起编译到mplayer中,所以需要将这两个插件的相关头文件及链接库路径添加到mplayer的编译配置文件中,如下步骤:
# tar zxvf mplayer-ls1b-module.tar.gz
# cd mplayer-ls1b-module
# ./config.sh
以上命令为生成默认mplayer编译配置文件config.mak。
# vi config.mak
对mplayer编译配置文件作以下修改:
File:./config.mak |
# -------- Generated by configure ----------- LANG = C MAN_LANG = en TARGET_OS = Linux DESTDIR = #设定make install后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 # FFmpeg uses libdir instead of LIBDIR 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]://[标题|[开始标题]−结束标题][/设备] [选项]
mplayer vcd://曲目[/设备]
mplayer tv://[频道][/输入ID] [选项]
mplayer radio://[频道|频率][/捕捉设备] [选项]
mplayer pvr:// [选项]
mplayer dvb://[卡号@]频道 [选项]
mplayer mf://[文件掩码|@列表文件] [−mf 选项] [选项]
mplayer [cdda|cddb]://曲目[−结束曲目][:速度][/设备] [选项]
mplayer cue://文件[:曲目] [选项]
mplayer
[file|mms[t]|http|http_proxy|rt[s]p|ftp|udp|unsv|icyx|noicyx|smb]://
[用户名:密码@]URL[:端口] [选项]
mplayer sdp://文件 [选项]
mplayer mpst://主机[:端口]/URL [选项]
mplayer tivo://主机/[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 -input file=</tmp/fifofile> <file>
对于slave模式的命令这里不作详细说明,可以在《MPlayer用户中文手册.pdf》中查阅相关部分,也可以参考mplayer模块测试例子。
下边主要使用mplayer模块测试例子来介绍如何在程序中通过管道传递slave模式命令给mplayer后台程序:
File:mplayer_test.c |
/* * Copyright (c) 2012,广州龙芯中科技术科技有限公司 * All rights reserved. * * 文件名称: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" #define MAXLEN 1024 #define IPR_FIFO "/tmp/mplayer-cmd" #define IPR_FIFO_PARAM "file=/tmp/mplayer-cmd" #define FILE_PATH "FirstLove.mp3" int fd_pipe[2]; //管道文件描述符 /********************************************************************************** * Function(功能):获取mplayer后台程序的打印输出信息 * parameter(参数): * outout(返回值): ***********************************************************************************/ void *get_player_msg() { printf("Get_player_msg:\n"); char data[MAXLEN]; unsigned int datalen; 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(返回值): ***********************************************************************************/ void mplayer_slave_cmd(char *cmd) { printf("Mplayer_slave_cmd:%s\n", cmd); char data[MAXLEN]; strcpy(data, cmd); int datalen = strlen(data); data[datalen++] = '\n'; data[datalen] = 0; int fp = 0; fp = open(IPR_FIFO, O_RDWR); write(fp, data, datalen); close(fp); } /********************************************************************************** * Function(功能):mplayer模块测试及使用例子 * parameter(参数): * outout(返回值): ***********************************************************************************/ int main() { pid_t pid; pthread_t tid_msg; pthread_mutex_t pmutex;
//建立命名管道 unlink(IPR_FIFO); mkfifo(IPR_FIFO, O_CREAT | 0666); //建立无名管道用于重定向接收mplayer的后台打印信息 if(pipe(fd_pipe) < 0) { perror("pipe error\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:Cannot start mplayer!!\n"); } printf("MPlayer progress exit!!\n"); exit(0); } else { //创建线程用以接收mplayer的打印信息 if(!pthread_create(&tid_msg, NULL, get_player_msg,NULL)) { pthread_detach(tid_msg); } else { printf("ERROR:Cannot create thread get_msg_player\n"); } pthread_mutex_init(&pmutex, NULL); } sleep(5); //测试slave模式 //首先传入mp3文件路径,进行音频播放 char cmd[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); return 0; } |