Simple small project: Mplayer-based video player (Linux)

Table of contents

0 video demo 

1 makefile

2 header files 

public.h

 show.h

do.c

3 source file.c 

Main function main.c

show.c 

 do.c

4 Project resource download

 https://download.csdn.net/download/m0_58193842/87371186?spm=1001.2014.3001.5503


    0. Store software log information in the form of files
    1. The program can load all audio and video files
    (.mp3 .mp4 .avi .rm .rmvb .flv .wma) under the specified path
    2. Can operate the video player through input

0 video demo 

Mplayer-based video player (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 header files 

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 source file.c 

Main function 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 Project resource download

 https://download.csdn.net/download/m0_58193842/87371186?spm=1001.2014.3001.5503

Guess you like

Origin blog.csdn.net/m0_58193842/article/details/128593810