回调函数

之前导师让写一个拼帧回调函数,里面需要用到一个函数作为参数,当时直接把声明传了进去,结果报错。然后就详细了解了一些关于回调函数的知识。

回调函数本质就在于一个函数作为另一个函数的参数。这样可以将一个函数实现的方法直接在另一个函数中调用。回调函数需要先声明后定义,然后将定义后的函数作为参数传入。

下面有具体的实例:

typedef int(*callback)(int, int);

int add (int a, int b)
{
    return a + b;
}

int add(int a, int b, callback p)
{
    return (*callback)(a, b);
}

int main()
{
    add(1, 2, add);
    return 0;
}
void printHello(int num)
{
    cout << "Hello" << num << endl;
}

void printWords(int num, void(*print)(int))
{
    for (int i = 0; i < num; i++)
    {
        (*print)(num);
    }
}

int main()
{
    printWords(5, printHello);
}
// printNumber(x) outputs "x", where x is an integer.
    void zero(function<void(int)> printNumber) {
        
    }

回调函数的作用:

  • 回调函数类似于一个管道
  • 它从最初始的函数中源源不断取出数据
  • 函数可以作为一个指针作为参数传入到另一个函数中

今日我遇到了一个问题,我在主函数中调用了一个回调函数,中间函数中输出一个字符串,但奇怪的是主函数运行正常,中间函数内的语句却并未被实现。导师的讲解是,中间函数类似于管道,主函数通过管道获取数据,如果数源不存在,那么中间函数(回调函数)就不会被调用。

具体解释看https://blog.csdn.net/yilovexing/article/details/93192484?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162090168416780274171121%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162090168416780274171121&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-93192484.pc_search_result_hbase_insert&utm_term=%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0

结合回调函数的流程

  1. 主函数需要调用回调函数

  2. 中间函数登记回调函数

  3. 触发回调函数事件

  4. 调用回调函数

  5. 响应回调事件

问题应该处在没有发生触发回调函数的事件。我所做的业务是从文件中读取ts流,然后通过拼帧前回调函数将16进制ts流放入到另一个文件,这里没有回调成功是因为没有收到流。即没有从文件中提取出ts流。

这种方法在音视频领域中被用来定位黑屏等问题,黑屏的定位方法

  • 收流:收流后调用拼帧前回调函数,如果调用不成功则说明没有输入的媒体流
  • 拼帧:调用拼帧后回调函数,如果调用不成功,则说明是拼帧过程出了问题
  • 解码:调用解码后回调函数,如果调用不成功,则说明解码不成功
  • 若以上三个步骤均没有产生错误,则说明播放器出了问题,可能是驱动坏了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值