之前导师让写一个拼帧回调函数,里面需要用到一个函数作为参数,当时直接把声明传了进去,结果报错。然后就详细了解了一些关于回调函数的知识。
回调函数本质就在于一个函数作为另一个函数的参数。这样可以将一个函数实现的方法直接在另一个函数中调用。回调函数需要先声明后定义,然后将定义后的函数作为参数传入。
下面有具体的实例:
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
结合回调函数的流程
-
主函数需要调用回调函数
-
中间函数登记回调函数
-
触发回调函数事件
-
调用回调函数
-
响应回调事件
问题应该处在没有发生触发回调函数的事件。我所做的业务是从文件中读取ts流,然后通过拼帧前回调函数将16进制ts流放入到另一个文件,这里没有回调成功是因为没有收到流。即没有从文件中提取出ts流。文章来源:https://www.toymoban.com/news/detail-413536.html
这种方法在音视频领域中被用来定位黑屏等问题,黑屏的定位方法文章来源地址https://www.toymoban.com/news/detail-413536.html
- 收流:收流后调用拼帧前回调函数,如果调用不成功则说明没有输入的媒体流
- 拼帧:调用拼帧后回调函数,如果调用不成功,则说明是拼帧过程出了问题
- 解码:调用解码后回调函数,如果调用不成功,则说明解码不成功
- 若以上三个步骤均没有产生错误,则说明播放器出了问题,可能是驱动坏了
到了这里,关于回调函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!