自学嵌入式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. 边界处理:播放索引的循环计算
相关推荐
QH1392923188019 小时前
罗德与施瓦茨 与ZNA43网络分析仪的联合测试流程
网络
晚风(●•σ )19 小时前
【华为 ICT & HCIA & eNSP 习题汇总】——题目集28
网络·计算机网络·华为·路由器·ensp·交换机
梦星辰.19 小时前
超大 JSONL 数据集交互式查看器 Linux便捷工具
linux·windows·microsoft
优选资源分享19 小时前
PDF Anti-Copy Pro v2.6.2.4:PDF 防拷贝工具
网络·安全·pdf
掘根19 小时前
【仿Muduo库项目】HTTP模块1——Util子模块
网络·网络协议·http
qq_4017004120 小时前
带宽与网速是一回事吗
网络
C_心欲无痕20 小时前
网络相关 - Ngrok内网穿透使用
运维·前端·网络
Lily480120 小时前
基于优先级的流量控制(PFC)
网络
go_bai20 小时前
Linux-网络基础
linux·开发语言·网络·笔记·学习方法·笔记总结
取个名字太难了a20 小时前
插入APC
windows