欢迎光临
我们一直在努力

用 C++ 手写一个音视频工具的命令行骨架:参数解析 + 任务回调系统

🎯 用 C++ 手写一个音视频工具的命令行骨架:参数解析 + 任务回调系统


一、为什么需要这个框架?

你可能用过 ffmpeg、handbrake-cli 这类命令行音视频工具,它们支持这样的命令:

./mytool –input video.mp4 –output out.mp4 transcode

背后其实有两件事要做:

  • 解析命令行参数(比如识别 –input 和它的值)
  • 根据任务名(如 transcode)
  • 如果每次加新功能都硬编码 if-else,代码会越来越乱。 所以,我们需要一个可扩展的命令分发系统——这正是本文要实现的。


    二、整体设计思路

    我们用两个核心机制:

    机制
    作用
    参数回调注册 告诉程序\”看到 –input 就调这个函数\”
    任务回调注册 告诉程序\”看到 transcode 就执行转码逻辑\”

    底层靠两个 std::map 实现:

    • map<string, function> 存参数处理器
    • map<string, function> 存任务处理器

    核心优势:新增参数或任务,只需注册一行代码,无需修改解析逻辑。


    三、完整可运行代码(三个文件)

    📄 文件 1:UserInput.h —— 接口声明

    #ifndef USER_INPUT_H
    #define USER_INPUT_H

    #include <string>
    #include <vector>
    #include <map>
    #include <functional>
    #include <iostream>

    class UserInput {


    public:
    // 给\”带字符串参数的函数\”起个别名
    using ParaCall = std::function<void(const std::string&)>;
    // 给\”字符串列表引用\”起个别名
    using ParaVec = const std::vector<std::string>&;

    // 参数回调表:如 \”–input\” -> 处理函数
    std::map<std::string, ParaCall> para_keys_;

    // 任务回调表:如 \”transcode\” -> 转码函数
    std::map<std::string, std::function<void(ParaVec)>> main_tasks_;

    // 注册参数处理函数
    void RegParam(const std::string& key, ParaCall func);

    // 注册主任务函数
    void RegTask(const std::

    赞(0)
    未经允许不得转载:171主机测评 » 用 C++ 手写一个音视频工具的命令行骨架:参数解析 + 任务回调系统
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址