目录
一、文档简介: 4
二、 Mplayer安装编译过程 4
1.安装定点mp3解码库libmad 4
2.安装流媒体支持工具live555 5
3.交叉编译Mplayer 5
三、 Mplayer的使用方法 8
1. Mplayer的简单使用 8
2. Mplayer的slave模式 8
一、文档简介:
本文档用于辅助使用者使用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;
}
|
|