1.深入剖析-ijkplayer框架【音视频开发】
2.2024年 C++音视频开发学习路线(ffmpeg/rtsp/srs/webrtc/hls)
深入剖析-ijkplayer框架【音视频开发】
随着互联网技术的源码迅猛发展,移动设备上的源码视频播放需求日益增长,催生了一系列开源和闭源播放器。源码这些播放器的源码功能虽然强大,兼容性也颇优,源码但其基本模块通常包括事务处理、源码细菌觅食算法源码数据接收和解复用、源码音视频解码以及渲染。源码以下是源码一个简化的基本框架图。
在众多播放器项目中,源码我们选择了ijkplayer进行源码分析。源码ijkplayer是源码私域用户源码一款基于FFPlay的轻量级Android/iOS视频播放器,支持跨平台,源码API易于集成,源码编译配置可裁剪,源码方便控制安装包大小。本文基于ijkplayer的k0.7.6版本,重点分析其C语言实现的核心代码,以iOS平台为例,Android平台实现类似,具体请读者自行研究。
ijkplayer的主要目录结构如下:tool(初始化项目工程脚本)、config(编译ffmpeg使用的大亨互娱源码配置文件)、extra(存放编译ijkplayer所需的依赖源文件,如ffmpeg、openssl等)、ijkmedia(核心代码)、ijkplayer(播放器数据下载及解码相关)、ijksdl(音视频数据渲染相关)、ios(iOS平台上的上层接口封装以及平台相关方法)、android(android平台上的上层接口封装以及平台相关方法)。iOS和Android平台在功能实现上的主要差异在于视频硬件解码和音视频渲染。
ijkplayer的初始化流程包括创建播放器对象,打开ijkplayer/ios/IJKMediaDemo/IJKMediaDemo.xcodeproj工程,视频解析源码赚钱在IJKMoviePlayerViewController类中viewDidLoad方法中创建了IJKFFMoviePlayerController对象,即iOS平台上的播放器对象。
ijkplayer的初始化方法具体实现如下:创建了IjkMediaPlayer结构体实例_mediaPlayer,主要完成了以下三个动作:创建平台相关的IJKFF_Pipeline对象,包括视频解码以及音频输出部分;至此,ijkplayer播放器初始化的相关流程已经完成。
ijkplayer实际上是基于ffplay.c实现的,本章节将以该文件为主线,从数据接收、音视频解码、音视频渲染及同步这三大方面进行讲解,用手机阅读源码要求读者具备基本的ffmpeg知识。
当外部调用prepareToPlay启动播放后,ijkplayer内部最终会调用到ffplay.c中的stream_open方法,该方法是启动播放器的入口函数,在此会设置player选项,打开audio output,最重要的是调用stream_open方法。
从代码中可以看出,stream_open主要做了以下几件事情:创建上下文结构体,设置中断函数,打开文件,探测媒体类型,打开视频、音频解码器,读取媒体数据,将音视频数据分别送入相应的queue中,重复读取和送入数据步骤。
ijkplayer在视频解码上支持软解和硬解两种方式,可在播放前配置优先使用的解码方式,播放过程中不可切换。iOS平台上硬解使用VideoToolbox,Android平台上使用MediaCodec。ijkplayer中的音频解码只支持软解,暂不支持硬解。
ijkplayer中Android平台使用OpenSL ES或AudioTrack输出音频,iOS平台使用AudioQueue输出音频。audio output节点在ffp_prepare_async_l方法中被创建。
iOS平台上采用OpenGL渲染解码后的YUV图像,渲染线程为video_refresh_thread,最后渲染图像的方法为video_image_display2。
对于播放器来说,音视频同步是一个关键点,同时也是一个难点。通常音视频同步的解决方案就是选择一个参考时钟,播放时读取音视频帧上的时间戳,同时参考当前时钟参考时钟上的时间来安排播放。
ijkplayer支持的事件比较多,具体定义在ijkplayer/ijkmedia/ijkplayer/ff_ffmsg.h中。在播放器底层上报事件时,实际上就是将待发送的消息放入消息队列,另外有一个线程会不断从队列中取出消息,上报给外部。
本文只是粗略的分析了ijkplayer的关键代码部分,平台相关的解码、渲染以及用户事务处理部分,都没有具体分析到,大家可以参考代码自行分析。
年 C++音视频开发学习路线(ffmpeg/rtsp/srs/webrtc/hls)
音视频工作领域繁复多样,自学时易陷入迷茫。本文整理出九个前景不错的方向:直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。以下为详细学习路线: 音视频基础音频基础知识
视频基础知识
解复用基础知识
FFmpeg开发环境搭建
音视频开发常用工具
FFmpeg实战教程FFmpeg命令
SDL跨平台
FFmpeg基石精讲
FFmpeg过滤器
FFmpeg音视频解复用+解码
ffplay播放器
FFmpeg音视频编码+复用合成视频
ffmpeg多媒体
FFmpeg+ QT播放器
流媒体客户端RTMP推拉流项目实战
RTSP流媒体实战
HLS拉流分析
流媒体服务器SRS源码剖析协程
ZLMediaKit源码剖析
WebRTC项目实战WebRTC中级开发实践指南
WebRTC高级开发-SRS 4.0/5.0源码分析
WebRTC高级开发-MESH模型多人通话
WebRTC高级开发-Janus SFU模型多人通话
Android NDKAndroid NDK开发基础
Android FFmpeg编译和应用
Android RTMP推拉流
Android Ijkplayer源码分析
iOS音视频开发iOS FFmpeg 6.0编译和应用
iOS FFmpeg RTMP推拉流
VideoToolbox硬件编解码
iOS jkplayer编译和应用
iOS ijkplayer编译和应用
音视频项目实战 相关开源网站与地址 本文涵盖音视频全栈开发技术,适合各类技术人员。2024-11-29 22:312719人浏览
2024-11-29 22:231389人浏览
2024-11-29 21:571041人浏览
2024-11-29 21:511778人浏览
2024-11-29 20:46968人浏览
2024-11-29 19:522948人浏览
1.学编程很无聊?13个有趣又好玩的Python游戏代码分享2.30个Python小游戏,上班摸鱼我能玩一天学编程很无聊?13个有趣又好玩的Python游戏代码分享 在编程的世界里,枯燥并非必选项
1.system在C语言里是什么意思2.一个Linux多进程编程?3.linux如何查看命令的源码4.linux 进程加载 - execve 系统调用5.linux源码中的struct pt_regs