自学嵌入式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. 边界处理:播放索引的循环计算
相关推荐
M1582276905513 小时前
TCP转LORA产品说明及应用案例
网络·网络协议·tcp/ip
旖旎夜光13 小时前
Linux(13)(中)
linux·网络
来可电子CAN青年13 小时前
CAN总线远距离传输老断网?Fx灯不闪别慌,这几招让你的通信“稳如泰山”!
网络
独行soc13 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
云小逸13 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
自不量力的A同学14 小时前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
春日见14 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
ESBK202514 小时前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
C++ 老炮儿的技术栈14 小时前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
莽撞的大地瓜15 小时前
洞察,始于一目了然——让舆情数据自己“说话”
大数据·网络·数据分析