- 博客(16)
- 资源 (48)
- 问答 (1)
- 收藏
- 关注
原创 ijkplayer播放器架构从原型到升级
ijkplayer是一款跨平台的播放器,支持Android与iOS端,核心部分基于ffmpeg,支持Android的mediacodec硬解与iOS的videotoolbox硬解,视频图像采用OpenGL进行渲染。许多主流播放器都使用ijkplayer作为播放方案。接下来我们从核心播放流程、内核播放架构、时序图、状态机、播放器整体架构进行详细分析。
2021-11-20 16:21:44 25490
原创 FFmpeg源码分析:avformat_find_stream_info分析码流信息
FFmpeg在调用avformat_open_input()之后,可能码流信息不够完整,可以使用avformat_find_stream_info()获取更多的码流信息。比如获取视频帧率、视频宽高,重新计算最大分析时长,打开解码器解码获取codec数据。
2021-11-30 15:10:31 36451 3
原创 FFmpeg源码分析:avformat_open_input()打开媒体流
avformat_open_input()用于打开输入媒体流与读取头部信息,包括本地文件、网络流、自定义缓冲区。关键流程:打开avio、探测输入流的封装格式。对应的释放方法为avformat_close_input()。
2021-11-27 23:47:21 36593
原创 FFmpeg源码分析: AVFrame与AVPacket
FFmpeg有两个存储帧数据的结构体,其中AVPacket是解封装后保存压缩数据包,AVFrame是解码后保存音视频帧。
2021-11-26 09:23:31 26425
原创 FFmpeg源码分析: AVStream码流
在AVCodecContext结构体存储有AVStream数组,包含所有视频流、音频流、字幕流的信息。每个码流包含有时间基、时长、索引数组、编解码器参数、dts、元数据。其中,索引数组用于保存每帧数据包offset、size、duration、flag,用于seek定位某个时间戳对应的帧。
2021-11-26 00:31:07 19964
原创 FFmpeg结构体分析: AVCodecContext编解码器上下文
AVCodecContext是FFmpeg编解码上下文的结构体,而AVCodec是编解码参数的结构体。AVCodecContex内部有包含AVCodec、AVCodecInternal等结构体,包含AVCodecID、AVMediaType、AVPixelFormat、AVSampleForat等枚举类型,包含视频的width、height、framerate、bitrate等关键参数,包含音频的samplerate、channels等参数。
2021-11-24 01:19:46 36293
原创 FFmpeg结构体分析:AVFormatContext连接FFmpeg的桥梁
AVFormatContext对开发者开放,是连接开发者与FFmpeg内部的桥梁。结构体内部包含有AVInputFormat、AVOutputFormat、AVCodec、AVStream、AVDictionary、AVClass等。支持设置自定义IO、监听网络中断状态、设置options、直播秒开调优等。
2021-11-23 01:02:33 20067
原创 FFmpeg源码分析:AVIOContext、IO模型与协议
FFmpeg的IO模型从avio_open()方法开始,核心结构体由AVIOContext和URLProtocol组成。如果需要读取缓冲区buffer数据进行播放,可以通过自定义AVIOContext,并且实现read_packet、write_packet、seek三个方法。如果需要播放加密视频,可以自定义私有协议进行解密,实现URLProtocol的open、read、write、seek、close等方法。
2021-11-21 15:14:55 36732
原创 ijkplayer音视频同步策略分析
音视频同步是播放器的一道必选题,也是面试官常问的面试题。大家应该都知道音视频同步时钟有三种,默认使用音频时钟作为同步源。但是面试官会有其他变种问法:如果直播流的音频落后或者中断怎么办?如果没有音频流,以什么时钟作为同步源?如果有两个音频流(原声和伴奏的播放场景)怎么办?如果视频时间戳落后或者超前怎么办,不同落后程度怎么处理?如果设置倍速播放有没影响?
2021-11-21 00:01:19 37553
原创 ijkplayer视频解码播放架构分析
ijkplayer是一款跨平台播放器,支持Android与iOS播放,视频渲染使用OpenGL ES。Android端视频解码可以用mediacodec,而iOS端视频解码用VideoToolbox。而软解部分使用FFmpeg的avcodec。
2021-11-20 00:03:13 26205
原创 ijkplayer音频解码播放架构分析
ijkplayer是一款跨平台播放器,支持Android与iOS播放,音频解码默认使用FFmpeg的avcodec软解。Android端播放音频可以用OpenSL ES和AudioTrack,而iOS端播放音频默认使用AudioQueue。
2021-11-18 21:54:14 39199
原创 ijkplayer自定义协议播放加密视频
FFmpeg实现http、https、hls、tcp、rtmp、ftp这些标准协议,但是要播放加密视频怎么办呢?ijkplayer在FFmpeg的libavformat模块进行扩展ijkio、ijklongurl、ijktcphook、ijkhttphook,我们也可以在这个基础上,自定义协议来进行解密播放。主要基于URLProtocol和AVClass进行扩展,实现protocol对应的方法。
2021-11-15 19:31:31 27863
原创 ijkplayer的时序与状态图分析
ijkplayer底层基于FFmpeg的ffplay.c进行改造与扩展,中间层进行Android与iOS的适配,Android需要添加JNI接口,而iOS可以直接调用c/c++。IJK作为一款优秀的开源跨平台播放器,具备完整的状态机,而且播放时序清晰。
2021-11-15 00:10:17 36949
原创 ijkplayer的API详细介绍
ijkplayer是一款优秀的跨平台播放器,核心代码在ff_ffplay.c,然后ijkplayer.c对ff_ffplay.c进行封装。接下来要介绍的API基于ijkplayer.c,除了常用API,另外有IJKMeta、property、option。
2021-11-14 15:16:57 37270
原创 基于google升级版c++代码规范指南
有些团队所有成员写的代码都一致,10个人写的代码像1个人写的。正因为有代码规范,使得代码可读性强,方便代码review,利于后期维护。这体现了代码规范的重要性。接下来,在参考google的代码规范基础上,详细列举代码规范细节。
2021-11-11 01:02:12 36743
原创 扩展ExoPlayer实现多音轨同时播放
如果要同时播放2个音频甚至播放多个音频怎么办呢?比如同时播放伴奏声音和原唱声音,而且要做到多音轨同步。这里涉及一个核心问题,多音轨播放如何同步,因为每个音轨有对应时钟。Android平台的ExoPlayer扩展性非常好,虽然本身不支持多音轨播放,但是我们可以扩展。通过扩展TrackSelector、AudioRender、RenderFactory来支持多音轨。
2021-11-07 16:05:31 27588 11
仿微信底部栏透明度渐变效果并且带红点提醒和未读数统计
2016-12-15
google为android打造的响应式编程agera
2016-11-12
android客户端语音聊天
2016-11-10
带动画的弧形仪表盘统计控件
2016-11-06
利用RecyclerView实现垂直滑动的ViewPager
2016-10-22
群成员@提醒
2016-10-07
类似微信QQ分享我的位置
2016-09-22
支持拍照的图片选择器
2016-09-20
android利用windowmanager实现悬浮窗
2016-09-15
Android自定义GridView长按拖动排序
2016-03-18
android自定义GridView拖拽排序
2016-03-18
android客户端远程操作数据库
2016-01-21
window平台的nginx rtmp服务器
2018-07-12
android端基于深度学习的车牌识别
2018-04-23
android端实时车牌识别
2018-01-09
Android基于socket的TCP通信
2017-04-16
Android端使用IjkPlayer的RTSP直播低延时
2018-05-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人