用android或是QT来开发视频播放程序相对来说比较简单,如果是在linux用纯C语言来进行开发,就显得比较麻烦,好在现在有很多开源项目能够帮助我们做什么事情,mplayer就是音视频播放开源项目中典型的例子。

首先需要去mplayer官方网站mplayer下载地址下载源代码,然后使用你的交叉编译工具进行编译,编译完成后会生成一个mplayer执行程序,在命令行执行mplayer就可以进行播放了。

但是,用c语言编程来实现mplayer的播放功能怎么实现呢,本文就来讲讲一个简单的mplayer播放器的实现。

一 、 创建一个管道,进行进程间通信

int fd_fifo;

int g_sock_pair[2]; //全双工管道标识符

int sock_stop_mplay[2];

char video_list[VIDEO_MAX_NUM][30];

void mplayer_init(void)

{

int sockID;

sockID=socketpair(AF_UNIX, SOCK_STREAM, 0, g_sock_pair);//建立全双工管道

if(sockID)

{

printf("the pipe is not contructed

");

exit(0);

}

else

{

IfPlay = FALSE;//设置标识符初始状态

IfStop = TRUE;

IfPause = FALSE;

IfQuit = TRUE;

video_over = FALSE;

}

if(pipe(sock_stop_mplay)<0)

{

printf("stop mplay pipe create error

");

return ;

}

}

二 、 获得视频播放目录的文件个数

int mplayer_get_video_name(void)

{

int i;

int num;

int total_num;

struct dirent **namelist;

char *filepath = "usr/video/";

memset(&video_list,0,sizeof(video_list));

num = scandir(filepath,&namelist,0,alphasort);

printf("the video num is: %d

",num);

if(num < 0)return -1;

if(num > VIDEO_MAX_NUM)

{

num = VIDEO_MAX_NUM;

}

for(i=0;id_name);

}

total_num = num-2;

return total_num;

printf("video name:%s

",video_list[0]);

}

三 、 mplayer播放器的实现

void video_play(void)

{

pid_t pid;

pid_t pid1;

FILE * fp;

char buf[1024];

int mark = 0; //播放标志

printf("the pid is %d

",getpid());

mplayer_init();

unlink("/usr/my_fifo"); //如果管道存在,则先删除

mkfifo("/usr/my_fifo",O_CREAT|0666);

perror("mkfifo");

fd_fifo=open("/usr/my_fifo",O_RDWR);

int pipe_fd[2]; //用于进程ID通信

int r_num;

char pipe_buf[100];

memset(pipe_buf,0,100);

if(pipe(pipe_fd)<0)

{

printf("pipe create error

");

return ;

}

pid = fork();

if(pid == 0)

{

char temp[100];

memset(temp,0,sizeof(temp));

printf("pid xxx= %d

",getpid());

sprintf(temp,"%d",getpid());

close(pipe_fd[0]);

if(write(pipe_fd[1],temp,strlen(temp))!=-1)

printf("child write success!

");

if((pid1=fork())==0)

{

//close(g_sock_pair[0]);

//dup2(g_sock_pair[1],1); //将子进程的标准输出重定向到管道的写端

int video_num = 0;

char *videoname;

int total_num;

char stop_cmd[20];

total_num = mplayer_get_video_name();

while(1)

{

if(mark)

{

video_num++;

printf("video_num = %d

",video_num);

if(video_num >= total_num)

{

video_num = 0;

printf("video_num more than total_num

");

}

}

videoname = video_list[video_num];

char videopath[50] = "/storage/unit_app/video/";

char sPlay[100]="mplayer -ao alsa -vo fbdev -vc on28190 -fs -slave -quiet -input file=/storage/my_fifo ";

strcat(videopath,videoname);

strcat(sPlay,videopath);

mplayer_background_pic();

memset(stop_cmd,0,20);

printf("begin play the video!

");

fp = popen(sPlay, "r");

if(fp ==NULL)

{

perror("popen");

exit(-1);

}

else

{

while(fgets(buf, sizeof(buf), fp))

{

printf("%s", buf);

}

printf("one video end play

");

pclose(fp);

mark = 1;

}

usleep(30000);

fcntl(sock_stop_mplay[0], F_SETFL, O_NONBLOCK);

read(sock_stop_mplay[0],stop_cmd,20);

if(strcmp(stop_cmd,"stop")==0)

{

mark = 0;

printf("rev the stop cmd

");

break;

}

printf("end the play pthread

");

}

exit(0);

}

if (waitpid(pid1, NULL, 0) != pid1)

{

fprintf(stderr,"Waitpid error!

");

exit(-1);

}

exit(0);

}

else if(pid >0)

{

close(pipe_fd[1]);

usleep(30000);

if((r_num=read(pipe_fd[0],pipe_buf,100))>0)

{

printf("%d numbers read from be pipe is %s

",r_num,pipe_buf);

childs_pid = atoi(&pipe_buf);

}

}

}

四、 mplayer的结束程序

void video_stop(void)

{

pid_t pid;

char cmd[100];

memset(cmd,0,100);

sprintf(cmd,"kill -9 %d",childs_pid);

char stop_cmd[20];

memset(stop_cmd,0,20);

sprintf(stop_cmd,"stop");

mplayer_send_cmd("quit

");

if(write(sock_stop_mplay[1],stop_cmd,strlen(stop_cmd))!=-1)

printf("write stop cmd success!

");

//clear_fb();

printf("kill childs_pid %d

",childs_pid);

system(cmd);

mplayer_del();

}

void mplayer_send_cmd(char *cmd)

{

write(fd_fifo,cmd,strlen(cmd));

}

void mplayer_del(void)

{

close(g_sock_pair[0]);//关闭管道

close(g_sock_pair[1]);

close(sock_stop_mplay[0]);

close(sock_stop_mplay[2]);

wait(NULL);//收集子进程信息

}

OK,只要实现上述代码,基本的mplayer播放器就可以实现了。

嵌入式linux播放视频 mplayer,嵌入式linux中mplayer播放视频编程实践相关推荐

  1. python创意小作品-[专题]在Python教学中应用turtle创意编程实践

    原标题:[专题]在Python教学中应用turtle创意编程实践 创意编程是用编程实现自己创意的过程.在2017年的信息技术新课程标准中,计算思维是信息技术的核心素养.计算思维是指利用计算机科学领域的 ...

  2. python创意turtle作品-[专题]在Python教学中应用turtle创意编程实践

    原标题:[专题]在Python教学中应用turtle创意编程实践 创意编程是用编程实现自己创意的过程.在2017年的信息技术新课程标准中,计算思维是信息技术的核心素养.计算思维是指利用计算机科学领域的 ...

  3. android播放器可点击列表,Android上是否有任何播放器可以支持播放列表中的本地视频并可以预设播放顺序?...

    试用Android QQ视频和Vplayer,它确实支持许多视频格式,但是发现它们不支持列表播放. 例如,当前手机上有5个视频剪辑,希望在播放器中设置不同的顺序以顺序播放. 就ABCDE而言,我可以尝 ...

  4. dw8制作html手机兼容视频,Dreamweaver8在网页中插入Flash视频

    在 Dreamweaver 的"文档"窗口中打开 index.html 页面,插入一个三列的表格,在由三列组成的表格的中间一列中放置的图形之上单击一次. 选择"插入&qu ...

  5. html 载入视频wmv,[转]Html中添加.wmv视频文件-Windows Media Player

    From: http://hi.baidu.com/ny_dsc/blog/item/d7d4ad35155cb6335ab5f5ab.html classid="CLSID:6BF52A5 ...

  6. html视频位置控制器,html5中返回音视频的当前媒体控制器的属性controller

    实例 检测该视频是否有媒体控制器:myVid=document.getElementById("video1"); alert("Controller: " + ...

  7. ppt在html播放,在 PowerPoint 网页版中成功播放视频

    使浏览器保持最新状态 最新视频可能使用可直接在浏览器中播放的格式,前提是浏览器是最新的并且支持此功能(称为 HTML 5). 因此,让视频播放的另一种方法是转到浏览器官网获取最新更新. 如果视频仍无法 ...

  8. 如何将视频导入到ipad中并播放

    首先在电脑上下载并安装itunes,然后用apple账号登入, 在ipad上从apple store中下载一个播放器如KMPlayer 点击itunes上小手机的图标,找到文件共享,选中应用KMPla ...

  9. 猿大师VLC播放程序在Chrome浏览器中同时播放25路RTSP摄像头视频流效果

    猿大师VLC播放程序在Chrome同时播放25路RTSP摄像头视频流效果,CPU及内存占用情况

  10. win7 计算机里显示视频,usb视频设备-在win7中,USB视频设备怎么显示啊 – 手机爱问...

    2008-06-11 Windows无法识别USBWindo USB不被电脑识别,如果是系统或系统自带的驱动的原因,一般经过重启就可恢复或开机按F8进入安全模式在退出,在进入正常模式(修复受损的注册表 ...

最新文章

  1. SQL SERVER 取所有表及注释 和 字段属性
  2. UIWebView如何加载本地图片
  3. Mac OS/Linux命令查询网络端口占用情况
  4. Bootstrap鼠标悬停下拉导航总结
  5. 开发人员转售前工程师_工程师和营销人员可以从中学到什么
  6. 一个不错的架构图:基于SpringCloud的微服务项目
  7. Hello designer|PPT笔记
  8. 荔枝派Nano 全流程指南
  9. python模拟鼠标点击脚本_python模拟鼠标点击和键盘输入的操作
  10. steam邮箱登录教程
  11. 泰克TDS3054B示波器技术指标
  12. MongoDB时间加减操作记录
  13. php seekdir,perl 模式匹配总结和shell命令调用方法 (zz)
  14. 自学Web前端的第14天
  15. 腾讯企业邮箱只能接受消息不能发送
  16. python做网络测试工具一
  17. matlab怎么伯努利分布,伯努利分布 Bernoulli distribution
  18. php nobody 没有写权限,laravel log文件分组nobody问题
  19. 贪心算法——聪明的LJY
  20. 数据结构与算法-Part6——数组与广义表

热门文章

  1. 基于Springboot+vue的电影票预定管理系统 elementui
  2. 谭晓生 计算机大会拖堂,360谭晓生不满会议拖堂怒摔话筒
  3. 没错,AR属于AI:A Tale of Two A's
  4. 南邮NOJ2066 好奇的奥利安娜 水题
  5. 周志华《机器学习》第八章复习(带例题)
  6. python词云需要导入什么_python-词云
  7. C++设计模式 - 备忘录模式(Memento)
  8. 怎么理解c语言,到底怎么样C语言才算入门?大一新生的痛:这些你理解了多少...
  9. excel里输入分数
  10. 2021高考成绩查询账号是什么,2021高考查分时间是几号-2021高考查分时间一览_飞翔教程...