简单小项目:基于Mplayer的视频播放器(Linux)

目录

0 视频演示 

1 makefile

2 头文件 

public.h

 show.h

do.c

3 源文件.c 

主函数main.c

show.c 

 do.c

4 项目资源下载

 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

猜你喜欢

转载自blog.csdn.net/m0_58193842/article/details/128593810