linux下如何hook第三方播放器的视频数据?

背景

作为显卡生产商,当用户使用我们的显卡硬解码播放视频时,如果出现比如花屏等问题,为了快速确定问题原因,我们需要一个工具来帮助判断出问题是出在原始视频端,亦或者是应用程序端,亦或者是显卡端。因此我们需要一种方法,来对目标播放器程序进行监控,并捕获到视频源的解码前和解码后数据,以便对其进行回放排查。

前置条件

此方法认为目标程序动态链接了ffmpeg,并使用ffmpeg提供的硬解码能力,其次假设目标程序的ffmpeg版本和我们要开发的小工具所依赖的ffmpeg版本一致。

方法概述

在linux下,我们使用LD_PRELOAD环境变量,利用此变量提供的hook能力去拦截目标程序所要调用的ffmpeg关键函数,如果需要解码前数据,那就拦截解封装函数。如果需要解码后数据,那就拦截解码函数。在拦截的函数中,我们添加自己的写文件操作,将两部分数据写到本地文件中即可。

关于如何使用LD_PRELOAD 劫持函数,可自查用法。
关注公众号:QTShared,免费阅读更多文章,免费获取源码。

示例

在本示例中我们分别劫持解封装函数和解码函数。

ffmpeg的解封装函数原型为:av_read_frame(AVFormatContext, AVPacket*),调用之后,ffmpeg会将数据填充到用户的AVPacket指针中。 一般用法是循环调用av_read_frame进行解封装并扔到队列,解码线程从队列取数据进行解码。

首先我们新建一个.c文件用来写我们的hook函数,

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 13:30:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 13:30:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 13:30:01       87 阅读
  4. Python语言-面向对象

    2024-03-15 13:30:01       96 阅读

热门阅读

  1. Ubuntu 根分区扩容

    2024-03-15 13:30:01       41 阅读
  2. RockChip Android13 修改U盘挂载目录

    2024-03-15 13:30:01       43 阅读
  3. 【笔记】学习Android.mk(四)

    2024-03-15 13:30:01       41 阅读
  4. 每天一个数据分析题(二百零六)

    2024-03-15 13:30:01       40 阅读
  5. jffs2文件系统挂载到Ubuntu,制作新的jffs2文件系统

    2024-03-15 13:30:01       40 阅读
  6. PyTorch学习笔记之基础函数篇(八)

    2024-03-15 13:30:01       31 阅读
  7. 实现两栏布局

    2024-03-15 13:30:01       36 阅读
  8. 基于Python的pygame库的五子棋游戏

    2024-03-15 13:30:01       31 阅读
  9. 大数据开发(Kafka面试真题-卷三)

    2024-03-15 13:30:01       43 阅读
  10. iOS runtime理解和应用场景

    2024-03-15 13:30:01       41 阅读
  11. python 读取pdf 将每页转成jpg

    2024-03-15 13:30:01       46 阅读
  12. C#使用Entity Framework Core处理数据库(一)

    2024-03-15 13:30:01       41 阅读