课程介绍:
适用人群
掌握c++基础语法,想要学习android平台编程,或者想要实践NDK编程的同学,想要学习音视频技术的同学
课程概述
Android影音(流媒体)播放器开发实战基于NDK、C++和FFmpeg
对学员要求:
本课程是具有很强实战性的应用编程,课程中会从原理讲解到代码实现,但由于项目有一定复杂度,希望学习本课程的同学要掌握c++的基本语法,课程中也用到java的代码但比较少,如果是c++程序员可以把我的java代码直接拿过去用,不一定要有java编程基础。
课程说明
课程包含了对流媒体(拉流)的播放,演示了播放rtmp的香港卫视,支持rtsp摄像头和http网络视频的播放,支持访问本地的视频文件,并精确控制播放进度。
特色
1 课程由浅入深,原理讲解+代码实操演示,并提供全部课程源码
2 讲解如何编译Android平台的ffmpeg库,使其支持neon和硬解码,并测试性能
3 使用opengles的NDK shader高效播放yuv视频,不耗费cpu性能更优
4 代码支持硬解码(省电不耗cpu)和多线程解码(高性能每秒解码240帧1080p)
5 支持网络流媒体(rtmp,rtsp,http)可以直接拉流播放电视并支持rtsp摄像头访问
6 使用opensles NDK 原生接口播放音频,不依赖第三方库
7 课程将设计模式应用到实践-观察者、构建者、门面、代理、适配器、单件、和生产者消费者。
课程目录:
章节1:课程介绍及音视频基础知识
课时1课程介绍18:06
课时2音视频基础知识Mpeg4封装格式音视频编码格式讲解10:15
课时3音视频解封装和解码原理分析18:01
课时4图形像素格式RGB和YUV格式分析15:36
课时5PCM音频采样率_通道_planar等格式参数分析08:37
课时6MP4标准和h264格式的NAL的GOP分析15:53
章节2:AndroidStudio开发工具和开发环境准备
课时7开发所用到的工具和sdk介绍07:29
课时8AndroidStudio开发工具安装使用讲解09:22
课时9Android SDK目录内容分析04:59
课时10AndroidNDK工具目录功能分析05:43
课时11安卓模拟器安装和第一个c++安卓程序编译运行15:22
章节3:Android NDK交叉编译FFMpeg
课时12安卓NDK相关概念ABI、NEON、JNI和CMAKE分析12:32
课时13NDK中CPU的应用二进制界面ABI09:00
课时14ubuntu虚拟机及常用工具安装并配置samba共享目录19:10
课时15ffmpeg源码下载在android下的编译参数分析讲解12:46
课时16在ubuntu下交叉编译ffmpeg的android版本库20:28
课时17ffmpeg通用编译bash脚本编写、硬解码、neon、多线程解码性能对比24:19
课时18AndroidStudio项目配置权限、jni库路径、ABI和CMake参数和讲解07:56
课时19cmake配置(导入库、头文件、链接)分析10:44
课时20创建支持ffmpeg的AndroidStudio项目并调用接口在界面显示库配置24:19
课时21JNI和c传递文件路径并设置app的读写权限17:51
章节4:FFmpeg解封装(C++ NDK)
课时22ffmpeg SDK软硬解码流程说明05:08
课时23ffmpeg音视频解封装用到的函数和结构体详解10:11
课时24avformat_open_input函数详解并示例打开mp4文件17:54
课时25AVFormatContext结构分析和清理代码示例08:23
课时26avformat_find_stream_info探测获取封装上下文的格式信息09:04
课时27AVStream和AVCodecParameters分析13:16
课时28通过遍历获取AVStream音视频流信息并打印参数16:08
课时29通过av_find_best_stream获取音视频流索引04:23
课时30av_read_frame读取帧数据函数分析和产生的空间问题分析07:06
课时31AVPacket结构解析空间申请-初始化-复制-引用计数函数讲解10:27
课时32av_seek_frame改变播放进度函数详解08:37
课时33av_read_frame和av_seek_frame代码示例并分析内存占用和清理情况10:03
章节5:FFmpeg软硬解和多线程解码(C++ NDK)
课时34AVCodecContext解码上下文初始化讲解和视频解码器打开的代码演示19:32
课时35打开音频解码器上下文05:14
课时36AVFrame格式解析和空间处理函数09:37
课时37avcodec_send_packet和avcodec_receive_frame函数讲解.07:22
课时38音视频多线程解码代码演示09:06
课时39音视频解码性能测试neon单线程和八线程解码测试代码13:56
课时40ffmpeg调用MediaCodec实现硬解码代码演示04:55
章节6:FFMpeg音频重采样和视频格式转换和显示
课时41sws_getContext和sws_scale像素格式和尺寸转换函数讲解12:43
课时42sws_scale像素格式转换代码演示15:45
课时43音频重采样SwrContext格式和swr_convert相关函数详解05:17
课时44swr_init音频重采样上下文初始化和swr_convert音频重采样代码17:08
课时45分析GLSurfaceView和NDK接口直接显示RGB视频数据相关函数09:34
课时46使用NDK通过GLSurfaceView双缓冲空间复制完成视频的播放22:31
课时47安卓视频播放窗口去掉标题栏、全屏、横屏06:42
章节7:OpenSLES音频播放
课时48OpenSLES播放音频步骤和接口讲解19:34
课时49创建OpenSLES音频播放测试项目并完成引擎初始化12:16
课时50完成OpenSLES混音器CreateOutputMix初始化06:11
课时51配置OpenSL的PCM音频输入格式04:39
课时52读取pcm音频文件并使用OpenSL播放23:41
章节8:EGL和OpenGLES Shader显示YUV视频
课时53egl和opengl_shader_glsl讲解13:55
课时54testopengles_shader项目配置和创建_完成java部分代码11:47
课时55使用NDKC++完成EGL、display、surface、contex配置和初始化20:21
课时56Opengl ES Shader顶点坐标和材质坐标分析10:52
课时57顶点着色器代码glsl代码编写07:01
课时58yuv420p片元着色器glsl编写14:22
课时59shader初始化完成并编译顶点和片元着色器代码11:40
课时60program渲染程序初始化给shader传递顶点和材质顶点数据16:05
课时61opengl的yuv纹理的创建和初始化18:06
课时62OpenglES纹理数据修改和显示09:16
课时63通过OpenglES纹理修改完成yuv文件的播放显示05:22
章节9:视频播放器项目实战1-需求和设计模式
课时64视频播放器项目设计说明和UML类图知识讲解13:28
课时65模块分解和用到的7个设计模式讲解13:31
课时66适配器、建造者、代理模式讲解14:16
课时67门面模式&生产者消费者模式07:11
课时68Observer观察者模式讲解和应用05:18
课时69解码显示帧数据处理顺序图和开发计划讲解07:09
章节10:视频播放器项目实战二 音视频解码解封装
课时70项目创建权限ABI和CMake相关库和头文件配置09:17
课时71创建安卓流媒体播放器XPlay项目并配置添加了解封装模块及日志类14:29
课时72FFDemux的Open实现打开媒体文件16:26
课时73FFdemux的Read读取帧数据接口编写11:21
课时74完成XThread线程类IDemux继承后在线程中读取帧数据13:57
课时75添加了XSleep完成XThread线程函数的停止和超时判断09:53
课时76观察者Observer模式的代码实现并使用IDemux进行测试14:11
课时77IDecode和FFDecode模块代码创建09:58
课时78FFDecode的Open打开解码器接口编写和Observer基类添加10:07
课时79添加IDemux的GetVPara获取视频XParamter参数接口用IDecode的Open05:55
课时80封装FFDecode解码的Send和Recv接口14:02
课时81读取媒体帧数据获取类型信息(音频、视频)存入XData08:13
课时82完成音视频解码和并重构解码器加入观察者模式12:13
课时83加入生产者消费者模式控制音视频缓冲19:14
章节11:视频播放器项目实战三 音视频播放
课时84IVideoView显示模块架构讲解和代码创建16:27
课时85IEGL类初始化封装java部分添加XPlay窗口类19:28
课时86XShader基于yuv420p的初始化Init代码完成并测试13:46
课时87XTexture初始化并完成GLVideoView的调用14:06
课时88GLVideoView完成使用shader显示视频27:49
课时89完成音频重采样IResample模块初始化代码09:40
课时90完成音频重采样IResample模块的处理功能22:23
课时91完成了IAudioPlay和SLAudioPlay的音频播放环境初始化32:09
课时92IAudioPlay的Update将音频压入缓冲队列并测试09:44
课时93SLAudioPlay音频播放完成并测试对MP4文件音视频播放09:53
课时94完成硬解码并完成NV21和NV12格式的shader显示编写35:32
课时95解决android8.0下opengles不能播放的问题和音频播放的回音问题04:32
章节12:频播放器项目实战四 完成架构解决同步和seek
课时96完成facade模式的IPlayer并实现Open接口.26:26
课时97完成Iplayer开始播放和窗口初始化接口08:30
课时98完成Builder模式的IPlayerBuilder构建IPlayer对象26:38
课时99完成IPlayerProxy代理模式并进行测试架构搭建完成12:19
课时100统一换算pts为毫秒使用IPlayer完成音视频同步播放25:41
课时101IDemux&FFdemux线程安全和Close清理函数编写07:00
课时102FFdecode和FFResample线程安全处理和Close清理函数编写10:44
课时103SLAudioPlay的线程安全处理和Close清理函数编写11:25
课时104XEGL的线程安全处理和Close清理函数编写06:47
课时105XShader线程安全处理和Close清理函数编写08:01
课时106XTexture和GLVideoView的线程安全和清理函数编写07:57
课时107IPlayer完成Close清理函数编写并完成多次打开视频文件的测试17:03
课时108添加打开视频按钮和进度滑动条并响应打开事件08:32
课时109添加视频打开路径和香港卫视rtmp打开路径的界面05:29
课时110完成通过界面多次打开视频文件,修正了多次打开显示出现的bug12:22
课时111在835cpu的手机中测试并修正了音频播放Close的bug09:48
课时112完成了播放进度的显示并修正了硬解码参数传递错误16:43
课时113滑动条拖动Seek视频开发策略详细分析07:08
课时114完成了IDemux的Seek和界面SeekBar的事件响应14:32
课时115添加了视频播放的暂停和恢复16:29
课时116修改了视频播放到结尾再次打开会锁死的bug08:30
课时117通过手动解码帧数据完成了IPlayer控制视频播放进度的功能
页:
[1]