自学嵌入式day36,mplayer+fifo+exec

媒体播放器程序核心功能解析

1. 数据结构与宏定义
  • 播放模式枚举 MODE

    • MODE_CYCLE:循环播放
    • MODE_RANDOM:随机播放
    • MODE_SINGAL:单次播放(注意:代码中拼写为SINGAL,应为SINGLE
  • 播放列表结构体 LIST

    c 复制代码
    typedef struct {
        char name[10][512]; // 存储最多10个媒体文件路径
        int total;          // 媒体文件总数
        int current;        // 当前播放索引
        MODE mode;          // 播放模式
    } LIST;
  • 媒体路径宏

    c 复制代码
    #define MEDIA_PATH "/home/linux/vm/09mp"
2. 初始化函数 do_init()
  • 功能:扫描媒体目录,构建播放列表并创建控制管道
  • 关键流程
    1. 使用 opendir 打开媒体目录
    2. 遍历目录项,筛选扩展名为 .mp4, .mp3, .flv 的文件
    3. 构建完整文件路径存入 list.name
    4. 初始化播放索引 list.current = 0 和播放模式 list.mode = MODE_CYCLE
    5. 使用 mkfifo 创建命名管道 /home/linux/vm/09mp/fifo(忽略已存在错误)
3. 播放控制函数
  • do_play(char* name)

    c 复制代码
    pid_t pid = fork();
    if (0 == pid) {
        execlp("mplayer", "mplayer", "-slave", "-input", 
               "file=/home/linux/vm/09mp/fifo", name, "-quiet", NULL);
        exit(1);
    }
    • 通过 fork + execlp 调用 mplayer
    • 使用 -slave 模式和 -input file=... 指定控制管道
  • do_pause()

    c 复制代码
    int fd = open("/home/linux/vm/09mp/fifo", O_RDWR);
    write(fd, "pause\n", 6);
    close(fd);
  • do_stop()

    • 包含完整的错误处理逻辑:
      • 检查管道打开状态
      • 验证写入字节数
      • 确保资源关闭
4. 播放列表管理
  • do_list()
    1. 打印播放列表索引和路径
    2. 通过 fgets 获取用户输入
    3. 根据输入索引调用 do_play()
5. 播放导航
  • do_prev()

    • MODE_CYCLE 模式下实现循环上一曲
    c 复制代码
    num = list.current;
    num--;
    if(num == -1) num = list.total - 1; // 修正边界: num = 2 -> list.total-1
  • do_next()

    • MODE_CYCLE 模式下实现循环下一曲
    c 复制代码
    num = list.current;
    num = (num + 1) % list.total; // 取模实现循环
6. 高级控制
  • do_seek()

    c 复制代码
    sprintf(buf,"seek %d 1\n",num); // 百分比跳转
    write(fd, buf, strlen(buf));
  • do_speed()

    • 未完整实现(函数体不完整)

技术要点总结

  1. 目录遍历 :使用 dirent.h 实现文件系统扫描
  2. 进程控制fork() + execlp() 调用外部播放器
  3. 进程间通信 :通过命名管道(FIFO)向 mplayer 发送控制命令
  4. 模式管理:枚举类型实现播放模式状态机
  5. 边界处理:播放索引的循环计算
相关推荐
埃博拉酱2 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21883 天前
.NET 本地Db数据库-技术方案选型
windows·c#
DianSan_ERP3 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
tryCbest3 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅3 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技3 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf
一个人旅程~3 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
2501_946205523 天前
晶圆机器人双臂怎么选型?适配2-12寸晶圆的末端效应器有哪些?
服务器·网络·机器人
linux kernel3 天前
第七部分:高级IO
服务器·网络