飞豹客 · 课能看,资料也能带走
飞豹客后端开发 会员免费

夏曹俊-FFmpeg安卓流媒体播放器开发实战-基于NDK C++和 FFmpeg Android

如果你在 Android 上遇到过这样的需求:把一个网络视频流拉下来、解出画面和声音、再自己渲染到屏幕上,而不是简单调个系统播放器——那这门课讲的就是这件事。它围绕 NDK、C++ 和 FFmpeg 展开,做的是一个可以播放流媒体的 Android 播放器,而不是教你怎么调用 MediaPlayer

单课价¥19.90新品 上架
会员价 会员免费开通会员后本篇可直接下载套餐详情
131 人关注 更新于 2026-08-31 永久有效
发货

网盘链接 · 支付成功后自动发货

保障

永久有效 · 链接失效免费补发

客服

每日 9:00-21:00 在线客服 联系客服

会员可免费下载本篇月会员、年会员、永久会员可免费领取。

开通会员 ›
购买本课销量 0 · 永久有效
会员价 · 单课标价 ¥19.90

会员 · 按档位

永久免费可领
年免费可领
月免费可领

游客按标价购买,不享受上表折扣。

支付成功后自动发放网盘链接,链接失效可找客服免费补

正版保障 极速发货 售后无忧

如果你在 Android 上遇到过这样的需求:把一个网络视频流拉下来、解出画面和声音、再自己渲染到屏幕上,而不是简单调个系统播放器——那这门课讲的就是这件事。它围绕 NDK、C++ 和 FFmpeg 展开,做的是一个可以播放流媒体的 Android 播放器,而不是教你怎么调用 MediaPlayer 或 ExoPlayer 这类现成组件。

它解决的是什么工作场景

系统播放器能覆盖大部分常规播放需求,但一旦涉及自定义协议、私有封装格式、边下边播的缓冲策略、音视频同步的精细控制,或者要把解码结果交给自己的渲染管线,就绕不开 FFmpeg 这一层。这门课处理的正是这个夹缝:在 Android 端用 C++ 通过 NDK 调用 FFmpeg,完成解封装、解码,再把数据交给上层显示和播放。它不承诺让你变成音视频专家,但能让你看懂一个播放器从读到流到出画面,中间到底经过了哪些环节,以及每个环节出问题时该往哪里查。

适合什么基础,先看哪几块

这门课不适合零基础。你需要能读懂 C++ 的基本语法和指针操作,对 Android 工程结构、JNI 调用有大致概念,否则 NDK 部分的编译和调试会消耗掉你大部分精力。如果你只是想做业务层开发,这门课性价比不高;如果你已经在做音视频相关功能,或者准备转向前述方向,它值得投入时间。

建议的切入顺序是:先看音视频基础与封装格式、编码格式那部分,把 Mpeg4 封装、音视频编码这些概念理清楚,否则后面看代码只是抄;接着看解封装和解码的原理分析,理解一个完整的包是怎么被拆成音频帧和视频帧的;最后再进入打开解码器上下文、多线程解码这些实操环节。工具和 SDK 的介绍可以边做边查,不必一开始就背下来。

学完之后能独立做什么,资料怎么用

比较现实的目标是:你能独立搭出一个能拉流、能解码、能出声出画的 Android 播放器原型,并且在音视频不同步、解码报错、线程卡顿这类问题上,知道从哪一层去定位。这已经是不少岗位面试里能讲清楚的东西,但离商用级播放器的完整度还有距离,别指望学完就能直接上线。

资料配合练习的方式很简单:不要只看视频。每讲完一个环节,就自己动手把对应部分的代码敲一遍,尤其是解码器上下文的打开和多线程解码这两块,只有自己跑过、改过参数、看过日志,才算真的理解。遇到编译或运行报错,先回到封装格式和解码原理那部分对照,多数问题都能在原理层面找到解释。整套资料的价值在于给你一条能跑通的链路,剩下的熟练度靠你自己反复调试积累。

课程目录

课程目录117 集
  • 课程介绍 夏曹俊-FFmpeg安卓流媒体播放器开发实战-基于NDK C++和 FFmpeg Android 是一份后端开发学习资料,内容围绕 C++、Android 展开。 内容涵盖:─
  • 01 课程介绍及音视频基础知识、─ 1 课程介绍、─ 3 音视频解封装和解码原理分析、─ 1 开发所用到的工具和sdk介绍、─ 2 打开音频解码器上下文、─ 5 音视频多线程解码代码演示 等主题。 适合对 C++、Android 有需求、希望一次性拿到完整资料的同学。 下方为完整资料与目录,可先看目录判断是否符合需要。 夏曹俊-FFmpeg安卓流媒体播放器开发实战-基于NDK C++和 FFmpeg Android ├──
  • 01 课程介绍及音视频基础知识 │ ├── 1 课程介绍.mp4
  • │ ├── 2 音视频基础知识Mpeg4封装格式音视频编码格式讲解.mp4
  • │ ├── 3 音视频解封装和解码原理分析.mp4
  • │ ├── 4 图形像素格式RGB和YUV格式分析.mp4
  • │ ├── 5 PCM音频采样率 通道 planar等格式参数分析.mp4
  • │ └── 6 MP4标准和h264格式的NAL的GOP分析.mp4
  • ├──
  • 02 AndroidStudio开发工具和开发环境准备 │ ├── 1 开发所用到的工具和sdk介绍.mp4
  • │ ├── 2 AndroidStudio开发工具安装使用讲解.mp4
  • │ ├── 3 Android SDK目录内容分析.mp4
  • │ ├── 4 AndroidNDK工具目录功能分析.mp4
  • │ └── 5 安卓模拟器安装和第一个c++安卓程序编译运行.mp4
  • ├──
  • 03 Android NDK交叉编译FFMpeg并添加测试AS项目 │ ├── 1 安卓NDK相关概念ABI NEON JNI和CMAKE分析 .mp4
  • │ ├──
  • 10 JNI和c传递文件路径并设置app的读写权限 .mp4
  • │ ├── 2 NDK中CPU的应用二进制界面ABI .mp4
  • │ ├── 3 ubuntu虚拟机及常用工具安装并配置samba共享目录 .mp4
  • │ ├── 4 ffmpeg源码下载在android下的编译参数分析讲解 .mp4
  • │ ├── 5 在ubuntu下交叉编译ffmpeg的android版本库 .mp4
  • │ ├── 6 ffmpeg通用编译bash脚本编写 硬解码 neon 多线 .mp4
  • │ ├── 7 AndroidStudio项目配置权限 jni库路径 ABI .mp4
  • │ ├── 8 cmake配置(导入库 头文件 链接)分析 .mp4
  • │ └── 9 创建支持ffmpeg的AndroidStudio项目并调用 .mp4
  • ├──
  • 04 FFmpeg解封装(C++ NDK) │ ├── 1 ffmpeg SDK软硬解码流程说明 .mp4
  • │ ├──
  • 10 AVPacket结构解析空间申请 初始化 复制 引用计数函数 .mp4
  • │ ├──
  • 11 av_seek_frame改变播放进度函数详解 .mp4
  • │ ├── 12 av_read_frame和av_seek_frame代码 .mp4
  • │ ├── 2 ffmpeg音视频解封装用到的函数和结构体详解 .mp4
  • │ ├── 3 avformat_open_input函数详解并示例打开mp .mp4
  • │ ├── 4 AVFormatContext结构分析和清理代码示例 .mp4
  • │ ├── 5 avformat_find_stream_info探测 .mp4
  • │ ├── 6 AVStream和AVCodecParameters分析 .mp4
  • │ ├── 7 通过遍历获取AVStream音视频流信息并打印参数 .mp4
  • │ ├── 8 通过av_find_best_stream获取音视频流索引 .mp4
  • │ └── 9 av_read_frame读取帧数据函数分析和产生的空间问题 .mp4
  • ├──
  • 05 FFmpeg软硬解和多线程解码(C++ NDK) │ ├── 1 AVCodecContext解码上下文初始化讲解和视频解码器 .mp4
  • │ ├── 2 打开音频解码器上下文 .mp4
  • │ ├── 3 AVFrame格式解析和空间处理函数 .mp4
  • │ ├── 4 avcodec_send_packet和receive .mp4
  • │ ├── 5 音视频多线程解码代码演示 .mp4
  • │ ├── 6 音视频解码性能测试neon单线程和八线程解码测试代码 .mp4
  • │ └── 7 ffmpeg调用MediaCodec实现硬解码代码演示 .mp4
  • ├──
  • 06 FFMpeg音频重采样和视频格式转换和显示 │ ├── 1 sws_getContext和sws_scale像素格式 .mp4
  • │ ├── 2 sws_scale像素格式转换代码演示 .mp4
  • │ ├── 3 音频重采样SwrContext格式和swr_convert .mp4
  • │ ├── 4 swr_init音频重采样上下文初始化和swr_conver .mp4
  • │ ├── 5 分析GLSurfaceView和NDK接口直接显示RGB视频 .mp4
  • │ ├── 6 使用NDK通过GLSurfaceView双缓冲空间复制完成视 .mp4
  • │ └── 7 安卓视频播放窗口去掉标题栏 全屏 横屏 .mp4
  • ├──
  • 07 OpenSLES音频播放 │ ├── 1 OpenSLES播放音频步骤和接口讲解 .mp4
  • │ ├── 2 创建OpenSLES音频播放测试项目并完成引擎初始化 .mp4
  • │ ├── 3 完成OpenSLES混音器CreateOutputMix初始 .mp4
  • │ ├── 4 配置OpenSL的PCM音频输入格式 .mp4
  • │ └── 5 读取pcm音频文件并使用OpenSL播放 .mp4
  • ├──
  • 08 EGL和OpenGLES Shader显示YUV视频 │ ├── 1 egl和opengl_shader_glsl讲解 .mp4
  • │ ├──
  • 10 OpenglES纹理数据修改和显示 .mp4
  • │ ├── 11 通过OpenglES纹理修改完成yuv文件的播放显示 .mp4
  • │ ├── 2 testopengles_shader项目配置和创建 .mp4
  • │ ├── 3 NDKC++完成EGL display surface .mp4
  • │ ├── 4 Opengl ES Shader顶点坐标和材质坐标分析 .mp4
  • │ ├── 5 顶点着色器代码glsl代码编写 .mp4
  • │ ├── 6 yuv420p片元着色器glsl编写 .mp4
  • │ ├── 7 shader初始化完成并编译顶点和片元着色器代码 .mp4
  • │ ├── 8 program渲染程序初始化给shader传递顶点和材质顶点 .mp4
  • │ └── 9 opengl的yuv纹理的创建和初始化 .mp4
  • ├──
  • 09 视频播放器项目实战-需求和设计模式 │ ├── 1 视频播放器项目设计说明和UML类图知识讲解 .mp4
  • │ ├── 2 模块分解和用到的7个设计模式讲解 .mp4
  • │ ├── 3 适配器 建造者 代理模式讲解 .mp4
  • │ ├── 4 门面模式 生产者消费者模式 .mp4
  • │ ├── 5 Observer观察者模式讲解和应用 .mp4
  • │ └── 6 解码显示帧数据处理顺序图和开发计划讲解 .mp4
  • ├──
  • 10 视频播放器项目实战-音视频解码解封装 │ ├── 1 项目创建权限ABI和CMake相关库和头文件配置 .mp4
  • │ ├── 10 添加IDemux的GetVPara获取视频XParamter .mp4
  • │ ├──
  • 11 封装FFDecode解码的Send和Recv接口 .mp4
  • │ ├──
  • 12 读取媒体帧数据获取类型信息(音频 视频)存入XData .mp4
  • │ ├──
  • 13 完成音视频解码和并重构解码器加入观察者模式 .mp4
  • │ ├──
  • 14 加入生产者消费者模式控制音视频缓冲 .mp4
  • │ ├── 2 创建安卓流媒体播放器XPlay项目并配置添加了解封装模块代码 .mp4
  • │ ├── 3 FFDemux的Open实现打开媒体文件 .mp4
  • │ ├── 4 FFdemux的Read读取帧数据接口编写 .mp4
  • │ ├── 5 完成XThread线程类IDemux继承后在线程中读取帧数据 .mp4
  • │ ├── 6 添加了XSleep完成XThread线程函数的停止和超时判断 .mp4
  • │ ├── 7 观察者Observer模式的代码实现并使用IDemux测试 .mp4
  • │ ├── 8 IDecode和FFDecode模块代码创建 .mp4
  • │ └── 9 FFDecode的Open打开解码器接口编写Observer .mp4
  • ├──
  • 11 视频播放器项目实战-音视频播放 │ ├── 1 IVideoView显示模块架构讲解和代码创建 .mp4
  • │ ├── 10 SLAudioPlay音频播放完成并测试对MP4文件音视频播 .mp4
  • │ ├── 11 完成硬解码并完成NV21和NV12格式的shader显示编写 .mp4
  • │ ├── 12 解决android8.0下opengles不能播放的问题 .mp4
  • │ ├── 2 IEGL类初始化封装java部分添加XPlay窗口类 .mp4
  • │ ├── 3 XShader基于yuv420p的初始化Init代码完成并测 .mp4
  • │ ├── 4 XTexture初始化并完成GLVideoView的调用 .mp4
  • │ ├── 5 GLVideoView完成使用shader显示视频 .mp4
  • │ ├── 6 完成音频重采样IResample模块初始化代码 .mp4
  • │ ├── 7 完成音频重采样IResample模块的处理功能 .mp4
  • │ ├── 8 完成了IAudioPlay和SLAudioPlay的音频播放 .mp4
  • │ └── 9 IAudioPlay的Update将音频压入缓冲队列并测试 .mp4
  • ├──
  • 12 视频播放器项目实战-完成架构解决同步和seek │ ├── 1 完成facade模式的IPlayer并实现Open接口 .mp4
  • │ ├── 10 XShader线程安全处理和Close清理函数编写 .mp4
  • │ ├── 11 XTexture和GLVideoView的线程安全和清理函数 .mp4
  • │ ├── 12 IPlayer完成Close清理函数编写并完成多次打开视频 .mp4
  • │ ├──
  • 13 添加打开视频按钮和进度滑动条并响应打开事件 .mp4
  • │ ├──
  • 14 添加视频打开路径和香港卫视rtmp打开路径的界面 .mp4
  • │ ├──
  • 15 完成通过界面多次打开视频文件 修正了多次打开显示出现的bug .mp4
  • │ ├── 16 在835cpu的手机中测试并修正了音频播放Close的bug .mp4
  • │ ├──
  • 17 完成了播放进度的显示并修正了硬解码参数传递错误 .mp4
  • │ ├──
  • 18 滑动条拖动Seek视频开发策略详细分析 .mp4
  • │ ├── 19 完成了IDemux的Seek和界面SeekBar的事件响应 .mp4
  • │ ├── 2 完成Iplayer开始播放和窗口初始化接口 .mp4
  • │ ├──
  • 20 添加了视频播放的暂停和恢复 .mp4
  • │ ├──
  • 21 修改了视频播放到结尾再次打开会锁死的bug .mp4
  • │ ├── 22 通过手动解码帧数据完成了IPlayer控制视频播放进度的功能 .mp4
  • │ ├── 3 完成Builder模式的IPlayerBuilder构建IP .mp4
  • │ ├── 4 完成IPlayerProxy代理模式并进行测试架构搭建完成 .mp4
  • │ ├── 5 统一换算pts为毫秒使用IPlayer完成音视频同步播放 .mp4
  • │ ├── 6 IDemux&FFdemux线程安全和Close清理函数编写 .mp4
  • │ ├── 7 FFdecode和FFResample线程安全处理Close .mp4
  • │ ├── 8 SLAudioPlay的线程安全处理和Close清理函数编写 .mp4
  • │ └── 9 XEGL的线程安全处理和Close清理函数编写 .mp4
  • └── 课件资料
  • ├── 010-088.exe └── 90-116.exe