C++中读取文件模拟视频流并使用回调函数处理数据

C++中读取文件模拟视频流并使用回调函数处理数据

flyfish

在 C++ 中,回调函数通常以函数指针、函数对象(包括 std::function)、成员函数指针或 Lambda 表达式的形式来实现。这里使用了 std::function<void(const std::vector<char>&)> 来定义回调函数类型

c 复制代码
#include <iostream>
#include <vector>
#include <functional>

// 函数原型:接受回调函数作为参数
void performOperation(const std::vector<int>& data, std::function<void(int)> callback) {
    for (int value : data) {
        // 调用回调函数处理每个元素
        callback(value);
    }
}

// 示例回调函数:打印接收到的值
void printValue(int value) {
    std::cout << "Received value: " << value << std::endl;
}

int main() {
    std::vector<int> values = {1, 2, 3, 4, 5};

    // 调用 performOperation,并传递 printValue 作为回调函数
    performOperation(values, printValue);

    return 0;
}
复制代码
Received value: 1
Received value: 2
Received value: 3
Received value: 4
Received value: 5

回调函数(Callback Function)是一种常见的编程模式,它允许将一个函数作为参数传递给另一个函数,并在特定的事件发生或条件满足时由另一个函数调用。

回调函数通常用于实现以下目的:

1 事件驱动编程:当某个事件发生时,系统调用预先注册的回调函数来处理该事件。例如,用户点击按钮时调用相应的回调函数来执行特定操作。

2 异步编程:在多线程或异步任务中,回调函数可以用于处理任务完成后的结果或通知。例如,异步网络请求完成时调用回调函数处理返回数据。

3 定制行为:通过传递不同的回调函数,可以定制函数或类的行为,使其适应不同的需求或场景。

C++实现的VideoStreamSimulator类,它接收文件名和处理数据的回调函数作为构造参数,并在start方法中打开文件并开始读取数据。每次读取一帧大小的数据后,会调用传入的回调函数来处理这些数据

c 复制代码
#include <iostream>
#include <fstream>
#include <functional>
#include <vector>

class VideoStreamSimulator {
public:
    VideoStreamSimulator(const std::string& filename, std::function<void(const std::vector<char>&)> callback)
        : filename(filename), dataCallback(callback) {}

    void start() {
        std::ifstream file(filename, std::ios::binary);
        if (!file.is_open()) {
            std::cerr << "Error opening file: " << filename << std::endl;
            return;
        }

        // 读取帧数据并调用回调函数处理
        while (!file.eof()) {
            std::vector<char> frameData;
            readFrame(file, frameData);
            if (!frameData.empty()) {
                dataCallback(frameData);
            }
        }

        file.close();
    }

private:
    std::string filename;
    std::function<void(const std::vector<char>&)> dataCallback;

    // 读取一帧数据
    void readFrame(std::ifstream& file, std::vector<char>& frameData) {
        // 估计每帧数据大小并动态分配空间
        const int bufferSize = 1024; // 初始缓冲区大小,根据实际情况调整
        char buffer[bufferSize];
        int bytesRead = 0;

        file.read(buffer, bufferSize);
        bytesRead = file.gcount(); // 获取实际读取的字节数

        if (bytesRead > 0) {
            // 将读取的数据添加到帧数据中
            frameData.insert(frameData.end(), buffer, buffer + bytesRead);
        }
    }
};

// 示例回调函数:输出帧数据大小
void processFrameData(const std::vector<char>& frameData) {
    std::cout << "Received frame data. Size: " << frameData.size() << " bytes" << std::endl;
    // 在此处添加自定义帧数据处理逻辑
}

int main() {
    std::string filename = "video.bin"; // 视频文件名
    // 创建VideoStreamSimulator对象,并指定回调函数
    VideoStreamSimulator videoStream(filename, processFrameData);

    // 启动视频流模拟器
    videoStream.start();

    return 0;
}
复制代码
Received frame data. Size: 1024 bytes
Received frame data. Size: 1024 bytes
Received frame data. Size: 1024 bytes
Received frame data. Size: 1024 bytes
Received frame data. Size: 1024 bytes
Received frame data. Size: 872 bytes
相关推荐
瞎折腾啥啊9 分钟前
CMake FetchContent与ExternalProject
c++·cmake·cmakelists
三品吉他手会点灯1 小时前
STM32 VSCode 开发-C/C++的环境配置中,找不到C/C++: Edit Configurations选项
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
来自远方的老作者1 小时前
第10章 面向对象-10.4 继承
开发语言·python·继承·单继承·多继承·super函数
逻辑驱动的ken1 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
小手cool1 小时前
如何在Java中根据另一个配对集合对一个集合进行排序
java·开发语言
升鲜宝供应链及收银系统源代码服务1 小时前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
qq_12084093712 小时前
Three.js 工程向:GLTFLoader 管线、Draco/KTX2 与资源管理
开发语言·javascript·ecmascript
下地种菜小叶2 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
csbysj20202 小时前
业务代表模式
开发语言