介绍 mplayer 播放器如何交叉编译、安装相关的库,在开发板上完成测试。USB wifi (360) : 如何从官网下载源码进行代码移植、安装相关无线工具、让嵌入式设备支持 WIFI。
任务 1: 安装 mplayer 播放器并学习使用方法
图片格式、音乐文件(.mp3)、视频文件(mp4)…….
学习文件编程: bmp 图片格式、JPG(jpeglib)。
视频编码解码: ffmpeg 库。
Mplayer 播放器: 源码开源,可以下载、可以更改….。 (X11)
安装 libmad 库方法
在 linux 系统目录下创建 libmad 文件夹: mkdir /work/libmad -p
将 libmad 源码解压到 /work/libmad目录下:
 [root@wbyq libmad-0.15.1b]# tar xvf /mnt/hgfs/linux-share-dir/libmad-0.15.1b.tar.gz
       复制代码
 
配置源码,生成 Makefile 文件
 [root@wbyq libmad-0.15.1b]# ./configure CC=arm-linux-gcc --enable-fpm=arm --host=arm-linux --disable-debugging --prefix=$PWD/_install
       复制代码
 
将 Makefile 文件第 129 行的-fforce-mem 选项去掉
编译安装
 [root@wbyq libmad-0.15.1b]# make && make install
       复制代码
 
将生成的.so 文件拷贝到开发板的 lib 目录下。
安装 mplayer 播放器
在/work 目录下创建一个 mplayer 文件夹
将源码解压到 mplayer 目录下
配置 mplayer 源码生成 Makefile 文件
 ./configure --prefix=$PWD/_install --cc=arm-linux-gcc --host-cc=gcc --target=arm-linux --enable-cross-compile --enable-mad --disable-gui --disable-menu --disable-x11 --yasm="" --extra-cflags=-I/work/libmad/libmad-0.15.1b/_install/include/ --extra-ldflags=-L/work/libmad/libmad-0.15.1b/_install/lib/
       复制代码
 
编译源码: make
编译成功之后会在当前目录下生成 mplayer 可执行文件,将该可执行文件拷贝到开发板根文件系统的/bin 目录下即可。
播放测试
 [root@tiny4412 ]#mplayer -zoom -x 800 -y 480 /work/video_file/Video_2018-12-11.wmv
       复制代码
 
Mplayer 播放器使用方式:
【1】主模式,运行 mplayer 播放器,播放器将占用当前的终端,在主模式下 mplayer 程序不能后台运行。
默认从键盘上(表示输入)获取输入信号对播放器进行控制。
【2】 从模式: 将 mplayer 播放器当做子进程启动,父进程可以通过管道与子进程之间进行通信。
进程间通信: 无名管道/命名管道(FIFO)、消息队列、内存映射(mmap)、内存共享、信号。
创建子进程的函数: fork 函数。
声卡驱动使用
将该压缩包拷贝到开发板根文件系统目录下,解码,运行声卡启动脚本。
开发板上解压: [root@tiny4412 ]#tar xvf /mnt/Tiny4412_SoundCard_wm8960.tar -C /work/
将耳机插在开发板的音频输出口上即可听到声音了。
 #include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>
/*获取标准输入的数据、写给FIFO文件*/void *pthread_func(void *argv){  int fd=open("/mplayer_fifo",2);  if(fd<0)  {    printf("FIFO文件打开失败!\n");    pthread_exit(NULL); //结束当前线程  }  char buff[100];  int len;  while(1)  {    printf("请输入命令:");    fflush(stdin);       //刷新缓冲区    fgets(buff,100,stdin); //从键盘上获取数据  get_percent_pos  get_file_name    len=strlen(buff);      // get_file_name [0~12] [13]='\n'    write(fd,buff,len);    // get_file_name '\n'    memset(buff,0,100);  }}
int main(int argc,char **argv){  int pid;    /*1. 创建无名管道*/  int fds[2];  pipe(fds);    /*2. 创建子进程*/  pid=fork();    /*子进程代码: mplayer播放器*/  if(pid==0)  {    /*将子进程的标准输出重定向到管道写端*/    dup2(fds[1],1);        /*启动子进程*/    execlp("mplayer","mplayer","-zoom","-x","800","-y","480","-slave","-quiet","-input","file=/mplayer_fifo","/work/video_file/Video_2018-12-11.wmv",NULL);  }  else /*父进程*/  {    char buff[100];    int cnt=0;        /*创建新的线程: 从键盘上获取输入的数据,写给播放器的FIFO文件*/    pthread_t threadID;    pthread_create(&threadID,NULL,pthread_func,NULL);    pthread_detach(threadID); //设置分离属性        while(1)    {      /*从管道的读端读取数据: 读取就是mplayer播放器输出的数据*/      cnt=read(fds[0],buff,100);      buff[cnt]='\0';      printf("播放器输出的值=%s\n",buff);    }  }  return 0;}
       复制代码
 任务 2:制作视频广告机
广告机应用场景: 公交站台、地铁车厢、银行前台大厅、高速公路、公园….
有些广告机只有视频播放,没有声音。
广告机都支持网络视频文件更新---->文件更新使用现成的服务器: FTP 服务器、NFS 服务器。
(1) 如何判断服务器上那些文件需要下载到本地? 通过 shell 脚本代码或者使用 C 语言。
(2) 更新的时间一般是固定的: 20:00 23:00 …… 通过时间函数判断时间是否到达。
(3) 在视频问好更新的时候,视频文件需要停止播放,可以在屏幕上显示提示(正在更新…..)。
广告机需要支持自动播放,播放一个自动切换下一个、循环播放。
调用读目录、循环遍历目录、得到视频文件、mplayer 播放器需要使用子进程方式启动。
广告机: 音量调整、选择视频播放…….都不是广告机的功能---是视频播放器的功能。
评论