简单小项目:基于Mplayer的视频播放器(Linux)
基于Mplayer的视频播放器(Linux)0.以文件的形式存储软件的日志信息1.该程序能够加载指定路径下所有的音视频文件(.mp3 .mp4 .avi .rm .rmvb .flv .wma)2.能够通过输入操作视频播放器
·
目录
https://download.csdn.net/download/m0_58193842/87371186?spm=1001.2014.3001.5503
0.以文件的形式存储软件的日志信息
1.该程序能够加载指定路径下所有的音视频文件
(.mp3 .mp4 .avi .rm .rmvb .flv .wma)
2.能够通过输入操作视频播放器
0 视频演示
基于Mplayer的视频播放器(Linux)
1 makefile
OBJ=ycx_mp4 OBJS+=./main.c OBJS+=./do.c OBJS+=./show.c H_FILE+=public.h H_FILE+=do.h H_FILE+=show.h $(OBJ):$(OBJS) gcc $(OBJS) -o $(OBJ) .PHONY: clean: rm $(OBJ) install: sudo cp $(OBJ) /bin uninstall: sudo rm $(OBJ) /bin/$(OBJ)
2 头文件
public.h
#ifndef __PUBLIC_H__ #define __PUBLIC_H__ #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <semaphore.h> #include <sys/wait.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <signal.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <dirent.h> typedef enum { STAT_FREE,//空闲 STAT_ON,//播放 STAT_PAUSE,//暂停 }STATING; typedef enum { CYCLE_ORDER,//顺序播放 CYCLE_SINGLE,//单曲循环 CYCLE_RANDOM,//随机播放 }VIDEO_MOD; #endif
show.h
#ifndef __SHOW_H__ #define __SHOW_H__ #include "public.h" extern void ShowSpeed(void); extern void ShowMenu(void); extern void LookList(void); extern void SwitchChoose(int tmp); extern void ShowLocation(void); extern void ShowMode(void); #endif
do.c
#ifndef __DO_H__ #define __DO_H__ #include "public.h" extern int GetChoose(void);//接收选项 extern void Start_Pause(void);//开始、暂停 extern void StopOff(void); // 停止 extern void LastFile(void); // 上一个 extern void NextFile(void); // 下一个 extern void SpeedOn(void); // 倍速播放 extern void Location(void); // 定位 extern void QuitApp(void); // 退出 extern void VideoMode(void); // 播放方式 extern void GetVideoFile(void); extern void DayBook(char *CmdSentence); #endif
3 源文件.c
主函数main.c
#include "show.h" #include "do.h" #include "public.h" int main(int argc, char const *argv[]) { mkfifo("fifo_mp3",0777); GetVideoFile();//获取媒体文件 while (1) { ShowMenu(); // 软件菜单栏显示 int choose = GetChoose(); // 接收输入选项 SwitchChoose(choose);//功能 system("clear"); } return 0; }
show.c
#include "show.h" #include "do.h" char *filename[1024] = {0}; int filenum = 0; extern int FileStat; void SwitchChoose(int tmp) { switch (tmp) { case 1: LookList(); // 查看播放列表 DayBook("input:1 >>> 查看播放列表,进入播放列表"); break; case 2: Start_Pause(); // 开始/暂停 DayBook("input:2 >>> 开始/暂停"); break; case 3: StopOff(); // 停止 DayBook("input:3 >>> 播放关闭"); break; case 4: LastFile(); // 上一个 DayBook("input:4 >>> 播放上一个"); break; case 5: NextFile(); // 下一个 DayBook("input:5 >>> 播放下一个"); break; case 6: SpeedOn(); // 倍速播放 DayBook("input:6 >>> 设置倍速,进入倍速选项列表"); break; case 7: Location(); // 定位 DayBook("input:7 >>> 定位播放进度"); break; case 8: VideoMode(); // 播放方式 DayBook("input:8 >>> 设置播放方式,进入播放方式列表"); break; case 9: QuitApp(); // 退出 break; default: printf("\33[31m\33[1m输入越界,请重新输入!!!\33[0m\n"); DayBook("error!!!输入越界,请重新输入!!!"); sleep(2); break; } } void ShowMenu(void) { system("clear"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[43m\33[1m| ***\33[31m视频播放器\33[0m\33[43m\33[1m*** |\33[0m\n"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[42m\33[1m* 1. 查看播放列表 *\33[0m\n"); printf("\33[42m\33[1m* 2. 开始/暂停 *\33[0m\n"); printf("\33[42m\33[1m* 3. 停止 *\33[0m\n"); printf("\33[42m\33[1m* 4. 上一个 *\33[0m\n"); printf("\33[42m\33[1m* 5. 下一个 *\33[0m\n"); printf("\33[42m\33[1m* 6. 倍速播放 *\33[0m\n"); printf("\33[42m\33[1m* 7. 定位 *\33[0m\n"); printf("\33[42m\33[1m* 8. 播放方式 *\33[0m\n"); printf("\33[42m\33[1m* 9. 退出 *\33[0m\n"); printf("\33[42m\33[1m*=================================*\33[0m\n"); printf("\33[1m\33[35m~~请输入您的选择:\33[0m"); } void LookList(void) // 查看播放列表 { system("clear"); char tmp[32]; printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[43m\33[1m| ***\33[31m视频播放器\33[0m\33[43m\33[1m*** |\33[0m\n"); printf("\33[43m\33[1m+=================================+\33[0m\n"); for (int i = 0; i < filenum; i++) { printf("\33[31m\33[1m%d. %s\33[0m\n", i + 1, filename[i]); } printf("\33[1m\33[35m~~输入“last”返回上一步\33[0m\n\n"); printf("\33[1m\33[35m~~请输入:\33[0m"); fgets(tmp, 32, stdin); if (!strcmp("last\n", tmp)) { DayBook("input: last >>> 返回主菜单"); return; } int num = atoi(tmp); if (num >= 1 && num <= filenum) { FileStat = num - 1; StopOff(); Start_Pause(); DayBook(filename[FileStat]); return; } else { printf("\33[31m\33[1m输入不正确,请重新输入!!!\33[0m\n"); DayBook("error!!!输入不正确,请重新输入!!!"); sleep(2); LookList(); } } void ShowSpeed(void) { system("clear"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[43m\33[1m| ***\33[31m视频播放器\33[0m\33[43m\33[1m*** |\33[0m\n"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[31m\33[1m1. 1倍速播放\33[0m\n\n"); printf("\33[31m\33[1m2. 2倍速播放\33[0m\n\n"); printf("\33[31m\33[1m3. 4倍速播放\33[0m\n\n"); printf("\33[1m\33[35m~~输入“last”返回上一步\33[0m\n\n"); printf("\33[1m\33[35m~~请输入您的选择:\33[0m"); } void ShowLocation(void) { system("clear"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[43m\33[1m| ***\33[31m视频播放器\33[0m\33[43m\33[1m*** |\33[0m\n"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[1m\33[35m~~输入“last”返回上一步\33[0m\n\n"); printf("\33[1m\33[35m~~或者请输入您要定位到num%%\33[0m\n"); printf("\33[1m\33[35m~~(请输入0~100)\33[0m\n"); printf("\33[1mInput :\33[0m"); } void ShowMode(void) { system("clear"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[43m\33[1m| ***\33[31m视频播放器\33[0m\33[43m\33[1m*** |\33[0m\n"); printf("\33[43m\33[1m+=================================+\33[0m\n"); printf("\33[31m\33[1m1. 顺序播放\33[0m\n\n"); printf("\33[31m\33[1m2. 单曲循环\33[0m\n\n"); printf("\33[31m\33[1m3. 随机播放\33[0m\n\n"); printf("\33[1m\33[35m~~输入“last”返回上一步\33[0m\n\n"); printf("\33[1m\33[35m~~或者请输入您要设定的播放模式(请输入):\33[0m"); }
do.c
#include "do.h" #include "show.h" void DayBook(char *CmdSentence) { time_t t = 0; struct tm *pt = NULL; time(&t); pt = localtime(&t); FILE *fp = NULL; fp = fopen("./log_video.log", "a+"); fprintf(fp, " \33[36m\33[1m[%04d-%02d-%02d %02d:%02d:%02d] 执行: \33[0m", pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday, pt->tm_hour, pt->tm_min, pt->tm_sec); fprintf(fp, "\33[32m%s\33[0m", CmdSentence); fputc('\n', fp); fclose(fp); } char Mplayerbuf[4096] = {0}; int FileStat = 0; // 切换媒体文件字符串数组 STATING stat_get = STAT_FREE; VIDEO_MOD MODING = CYCLE_ORDER; extern char *filename[1024]; extern int filenum; void GetVideoFile(void) { DIR *fdir; fdir = opendir("/home/linux/Music"); if (NULL == fdir) { perror("fail to open"); exit(0); } struct dirent *pdir; while (1) { pdir = readdir(fdir); if (NULL == pdir) break; char *tmpbuf = pdir->d_name; while ('\0' != *tmpbuf) // 找末尾 { tmpbuf++; } while ('.' != *tmpbuf) // 找 . { tmpbuf--; } if (!strcmp(tmpbuf, ".mp3") || !strcmp(tmpbuf, ".mp4") || !strcmp(tmpbuf, ".avi") || !strcmp(tmpbuf, ".wma") || !strcmp(tmpbuf, ".rmvb") || !strcmp(tmpbuf, ".flv") || !strcmp(tmpbuf, ".rm")) { filename[filenum++] = pdir->d_name; } } } int GetChoose(void) // 接收选项 { char tmp[4]; fgets(tmp, 4, stdin); return atoi(tmp); } void Start_Pause(void) // 开始、暂停 { if (stat_get == STAT_FREE) //==========开始========= { char tmpbuf[1024] = {0}; sprintf(tmpbuf, "/home/linux/Music/%s", filename[FileStat]); stat_get = STAT_ON; pid_t pid = fork(); if (pid > 0) { // 父进程 } else if (pid == 0) { close(1); close(2); execlp("mplayer", "mplayer", "-slave", "-input", "file=./fifo_mp3", tmpbuf, NULL); perror("fail to mplayer"); } else { perror("fail to fork"); return; } } else //=============暂停pause============ { int fd = open("./fifo_mp3", O_WRONLY); if (-1 == fd) { perror("fail to open"); return; } write(fd, "pause\n", 6); if (stat_get == STAT_ON) { stat_get = STAT_PAUSE; } else if (stat_get == STAT_PAUSE) { stat_get = STAT_ON; } close(fd); } } void StopOff(void) // 停止 { int fd = open("./fifo_mp3", O_WRONLY | O_NONBLOCK); if (-1 == fd) { perror("fail to open"); return; } write(fd, "stop\n", 5); close(fd); stat_get = STAT_FREE; } void LastFile(void) // 上一个 { if (MODING == CYCLE_ORDER) // 顺序循环 { if (0 == FileStat) { printf("已是第一个文件无法切换上一个\n"); sleep(2); return; } StopOff(); // 关闭当前文件 FileStat--; Start_Pause(); // 播放 } else if (MODING == CYCLE_SINGLE) // 单曲循环 { StopOff(); // 关闭当前文件 Start_Pause(); // 播放 } else if (MODING == CYCLE_RANDOM) // 随机循环 { StopOff(); // 关闭当前文件 FileStat = rand() % filenum; Start_Pause(); // 播放 } } void NextFile(void) // 下一个 { if (MODING == CYCLE_ORDER) { if (filenum == (FileStat + 1)) { printf("最后一个文件无法切换下一个\n"); sleep(2); return; } StopOff(); // 关闭当前文件 FileStat++; Start_Pause(); // 播放 } else if (MODING == CYCLE_SINGLE) // 单曲循环 { StopOff(); // 关闭当前文件 Start_Pause(); // 播放 } else if (MODING == CYCLE_RANDOM) // 随机循环 { StopOff(); // 关闭当前文件 FileStat = rand() % filenum; Start_Pause(); // 播放 } } void SpeedOn(void) // 倍速播放 { ShowSpeed(); char tmp[12]; fgets(tmp, sizeof(tmp), stdin); if (!strcmp("last\n", tmp)) { DayBook("input: last >>> 返回主菜单"); return; } int fd = open("./fifo_mp3", O_WRONLY | O_NONBLOCK); // 管道会阻塞 if (-1 == fd) { perror("fail to open"); sleep(2); return; } int data = atoi(tmp); switch (data) { case 1: write(fd, "speed_set 1\n", 12); printf("\33[1m当前为 1 倍速\33[0m\n"); DayBook("input:1 >>> 设置1倍速"); sleep(2); break; case 2: write(fd, "speed_set 2\n", 12); printf("\33[1m当前为 2 倍速\33[0m\n"); DayBook("input:2 >>> 设置2倍速"); sleep(2); break; case 3: write(fd, "speed_set 4\n", 12); printf("\33[1m当前为 4 倍速\33[0m\n"); DayBook("input:3 >>> 设置3倍速"); sleep(2); break; default: printf("\33[31m\33[1m输入不正确,请重新输入!!!\33[0m\n"); DayBook("error!!!输入不正确,请重新输入!!!"); sleep(2); SpeedOn(); break; } close(fd); } void Location(void) // 定位 { ShowLocation(); char tmp[12]; char Tmpbuf[1024] = {0}; fgets(tmp, sizeof(tmp), stdin); if (!strcmp("last\n", tmp)) { DayBook("input: last >>> 返回主菜单"); return; } int fd = open("./fifo_mp3", O_WRONLY | O_NONBLOCK); // 管道会阻塞 if (-1 == fd) { perror("fail to open"); sleep(2); return; } int data = atoi(tmp); char tmpbuf[1024] = {0}; if (data >= 0 && data <= 100) { sprintf(tmpbuf, "seek %d 1\n", data); write(fd, tmpbuf, strlen(tmpbuf)); sprintf(Tmpbuf, "定位到%d%%", data); DayBook(Tmpbuf); close(fd); return; } printf("\33[31m\33[1m输入不正确,请重新输入!!!\33[0m\n"); DayBook("error!!!输入不正确,请重新输入!!!"); sleep(2); Location(); } void VideoMode(void) // 播放方式 { ShowMode(); char tmp[12]; fgets(tmp, sizeof(tmp), stdin); if (!strcmp("last\n", tmp)) { DayBook("input: last >>> 返回主菜单"); return; } int fd = open("./fifo_mp3", O_WRONLY | O_NONBLOCK); // 管道会阻塞 if (-1 == fd) { perror("fail to open"); sleep(2); return; } int data = atoi(tmp); switch (data) { case 1: MODING = CYCLE_ORDER; printf("\33[1m当前为循环播放\33[0m\n"); DayBook("input:1 >>> 设置循环播放"); sleep(2); break; case 2: MODING = CYCLE_SINGLE; printf("\33[1m当前为单曲循环\33[0m\n"); DayBook("input:2 >>> 设置单曲循环"); sleep(2); break; case 3: MODING = CYCLE_RANDOM; printf("\33[1m当前为随机播放\33[0m\n"); DayBook("input:3 >>> 设置随机播放"); sleep(2); break; default: printf("\33[31m\33[1m输入不正确,请重新输入!!!\33[0m\n"); DayBook("error!!!输入不正确,请重新输入!!!"); sleep(2); VideoMode(); break; } close(fd); } void QuitApp(void) // 退出 { StopOff(); system("clear"); printf("\33[42m\33[1m\33[31m 期待下次再见! \33[0m\n"); printf("\33[1m Mplayer已退出!!!\33[0m\n"); DayBook("Mplayer已退出!!!"); exit(0); }
4 项目资源下载
https://download.csdn.net/download/m0_58193842/87371186?spm=1001.2014.3001.5503
更多推荐
已为社区贡献1条内容
所有评论(0)