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

这篇具有很好参考价值的文章主要介绍了简单小项目:基于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.能够通过输入操作视频播放器

linux mplayer,Linux基础,c语言常见简单demo,c语言,音视频,c语言,linux,ubuntu,后端

0 视频演示 

基于Mplayer的视频播放器(Linux)文章来源地址https://www.toymoban.com/news/detail-550025.html

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

到了这里,关于简单小项目:基于Mplayer的视频播放器(Linux)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)

    介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视

    2024年02月05日
    浏览(72)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)

    介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视

    2024年02月02日
    浏览(75)
  • QT简单的视频播放器

    1.功能 选择路径下的固定视频格式文件播放,对应的音频和视频同步播放 2.新建一个不含UI界面的QT工程 特别注意:QT中的路径名不能含中文   设置一个不含UI界面的工程 取消构建目录 因为要引入视频播放器的模块,我们在pro中引入对应的模块 因为要引入布局格式,所以我们

    2024年02月03日
    浏览(40)
  • qt实现简单的视频播放器

    2024年02月11日
    浏览(54)
  • Android Studio——简单视频播放器

            三个界面:主界面,视频列表界面,视频播放界面,如下图所示:         (1)主界面设计            很简单,就一个背景和一个控件,然后为控件设置点击事件,然后跳转到视频列表界面    activity_main.xml界面  MainActivity.java类           (2)视频列表界面

    2024年02月07日
    浏览(49)
  • 零基础用Android Studio实现简单的本地视频播放器

    本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。 (本文章的代码参考: https://www.jb51.net/article/122051.htm) 实现效果: 用Android Studio做的

    2024年02月02日
    浏览(68)
  • 简单版本视频播放服务器V3-前端优化-播放器在左,列表在右侧【推荐】【完成】

    做个家用版本的家庭影院,通过这个服务器可以给电脑,平板,手机等设备提供直接播放电影的作用,通过离线下载电影放入目录里就是就可以给全家提供电影播放了,通过浏览器就是可以访问电脑里面的视频,实现简单的家庭版本服务了。 1.0最终代码:【前端以这个为主;

    2024年02月16日
    浏览(43)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月12日
    浏览(67)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月13日
    浏览(61)
  • java项目之网络视频播放器(ssm+mysql+jsp)

    风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络视频播放器。 技术交流和部署相关看文章末尾!  开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包