自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

徐福记456

让分享成为习惯,让开源促进成长

  • 博客(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

google为android打造的响应式编程agera,类似rxjava与rxandroid、rxbus、rxbinding的结合体,提供五大核心:content、database、net、rvdatabinding、rvadapter

2016-11-12

android客户端语音聊天

android客户端的语音聊天:从录音到发送再接收播放。支持手势上滑取消发送,自设定录音时长,10s倒计时提醒,未读语音消息红点提示,未读语音连续播放,可暂停播放,支持切换播放模式(听筒播放与扬声器播放)。

2016-11-10

带动画的弧形仪表盘统计控件

弧形仪表盘统计控件,根据总数自动标志刻度线,弧形中间可显示当前人数与总人数以及百分比,进度条发生改变时有动画渐变效果,调用简单只需传入总人数与当前人数。

2016-11-06

android插件化加载并启动外部apk

采用360提供的DroidPlugin方案,通过插件化加载安装,并启动外部apk。需要为插件预申请对应权限。

2016-11-01

仿支付宝咻一咻波纹扩散动画

仿支付宝咻一咻波纹扩散动画,使用属性动画组合播放,可设置波纹圆圈个数、放大倍数、播放延时时间、圆圈半径、圆圈颜色

2016-10-30

利用RecyclerView实现垂直滑动的ViewPager

利用自定义RecyclerView实现垂直滑动的ViewPager,在垂直方向可以上下滑动,换页过程中加上切入切出的动画。做成签到列表,点击签到(模拟)请求网络成功后,提示签到成功延迟2s,该页面从签到列表移除。

2016-10-22

群成员@提醒

首先,在编辑框输入@字符,跳转到选择群成员界面:支持多选、全选、反选、根据姓名与手机号码搜索。选择完成点击确定后,选中的群成员自动填充到编辑框,并且用spannable上色。点击群成员区域,设置光标落在尾处,支持删除。模拟未读@消息提醒,右上角有悬浮按钮,点击后滑动到未读消息处。

2016-10-07

android与js互相调用

android调用js方法向网页输入文字,js调用android本地相册图片、调用摄像头拍照、调用本地视频播放。

2016-10-07

类似微信QQ分享我的位置

与微信QQ的即时消息中分享位置相似,点击查看位置按钮即可定位我的当前位置,支持地理位置模糊搜索,有位置列表可选择,地图支持缩放、拖动查看。返回经纬度、地址与位置截屏,使用自定义控件展示位置截屏图片附着所处地址,点击图片可查看位置详情。

2016-09-22

支持拍照的图片选择器

可设置选择图片最大数量,支持拍照与本地相册选择,支持手势缩放与拖动预览。采用facebook开源的图片加载库fresco进行图片浏览。图片尺寸与手机屏幕适配,按比例压缩不变形。采用recylerView展示选中图片,支持添加、删除与点击预览。

2016-09-20

android利用windowmanager实现悬浮窗

核心在于WindowManager,通过它创建一个LayoutParams对象,然后利用该对象设置flag、gravity、xy坐标点。它提供三个方法:addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。主要分析更新view的实现过程:实现触摸事件监听,重写onTouch()方法,在ActionDown时,利用getRawX和getRawY得到x1、y1,在ActionMove时,利用getX和getY获取移动过程的x2、y2,两者作差后作为更新的view对应的xy坐标,调用updateLayout()实现更新。

2016-09-15

垂直换行滚动广告

自定义一个控件MarqueeView实现动画切入切出的垂直换行,可设置动画时间、换行时间价间隔,控制广告的播放与暂停,动态配置广告。

2016-09-12

Android自定义GridView长按拖动排序

android自定义GridView长按拖动排序,类似支付宝首页,震动提示,固定最后一个“更多”item。退出应用程序后,保存修改的item位置到数据库,实现记住修改位置。

2016-03-18

android自定义GridView拖拽排序

android自定义GridView长按拖动排序,类似支付宝首页,震动提示,固定最后一个“更多”item。退出应用程序后,保存修改的item位置到数据库,实现记住修改位置。

2016-03-18

android人脸识别

基于android平台,实现在线人脸识别、检测、聚焦,离线人脸检测,动态视频人脸检测(支持多脸),正确识别率达到99%,带着眼镜也可以正确识别。

2016-01-23

android多线程断电续传下载文件

android平台根据文件大小,可设置线程数,下载记录保存在数据库,下载完毕删除记录,实现断电续传下载。

2016-01-22

android客户端远程操作数据库

基于android客户端(ADT22、API18),通过HTTPGet与服务端通信,在URL传输参数指令,读取服务端反馈回来的结果,实现远程操作MySQL数据库。服务端基于MyEclipse10环境,使用servelet+struts2+tomcat,接收客户端HTTP请求,实现连接数据库,对数据库增删查改等。

2016-01-21

android操作MySQL数据库

基于android平台,通过JDBC连接MySQL数据库,实现增删查改操作

2016-01-21

http请求json并解析数据

利用tomcat作为服务器,客户端采用HTTP方式请求json数据并进行解析

2016-01-19

rfc3711_srtp.pdf

srtp为安全加密的rtp传输,增加ssl握手协议

2022-01-09

rfc3489_STUN.pdf

WebRTC的打洞过程,使用STUN会话遍历访问防火墙

2022-01-09

rfc7826_rtsp.pdf

rtsp实时传输流协议,包括register、setup、play、pause、teardown等控制

2022-01-09

rfc5506_RTCP.pdf

rtcp音视频实时传输控制协议,统计丢包、延迟

2022-01-09

neon指令硬件加速_CodingForNeon.pdf

neon指令实现ARM平台的硬件加速,SIMD单指令多数据,寄存器并行运算

2022-01-09

hls直播协议_rfc8216_hls.pdf

hls直播协议,描述hls工作原理、m3u8结构、ts流传输

2022-01-09

混响音效_HybridReverb.pdf

混响音效原理介绍与控制参数

2022-01-09

android平台的车牌识别so库

支持车牌的实时识别,支持蓝色、黄色、绿色新能源等车牌,识别耗时比较短,大概单个车牌是180ms,识别率比较高

2019-02-23

android平台的车牌识别

基于openCV的车牌检测结合深度学习进行车牌识别,支持蓝色、黄色、新能源车牌

2019-01-06

基于ORM的数据库框架Room

基于ORM的数据库框架Room,Android原生API,官方推荐使用,类似GreenDAO数据库。

2018-09-24

window平台的nginx rtmp服务器

window平台的nginx rtmp服务器,点击nginx.exe就可以开启服务,在网页输入rtmp推流地址就可以实时拉流直播,也可以使用ijkplayer或者ffplay进行播放

2018-07-12

Android端基于TensorFlow进行图像分类

Android端基于TensorFlow进行图像分类,使用Assets目录训练好的样本库和标签文件,识别率相当准确。

2018-06-30

android端基于深度学习的车牌识别

android端,基于openCV与深度学习,实现快速准确的车牌识别。平均识别耗时350ms左右,采集100样本识别准确率达到95%。识别过程:1、使用openCV确定车牌左右、上下区域;2、车牌倾斜判断与校正;3、滑动切割字符;4、深度学习对每个字符进行识别

2018-04-23

android端采用FFmpeg实现音频拼接/剪切/混音与转码

android端采用FFmpeg,传入命令行调用run()方法,实现音频拼接/剪切/混音与转码

2018-01-23

android端实时车牌识别

android端,基于openCV与深度学习,实现快速准确的车牌识别。平均识别耗时350ms左右,采集100样本识别准确率达到95%。识别过程:1、使用openCV确定车牌左右、上下区域;2、车牌倾斜判断与校正;3、滑动切割字符;4、深度学习对每个字符进行识别

2018-01-09

android注入dex实现热修复

android通过反射注入dex到dexElements数组,实现bug的热修复

2018-01-05

android版美颜宠萌相机

android平台的美颜相机,基于openCV进行人脸检测,添加各种宠萌效果

2018-01-01

ndk处理图片:添加文字和图片水印

android平台,ndk处理图片,添加文字和图片水印,可灵活控制水印的位置

2017-12-27

使用NDK拼接长图

使用NDK对多张图片进行拼接,先对每张图片进行预处理:压缩,剪裁宽度高度一致,最后得到一张长图,看起来效果很酷。美图秀秀的必备技能。

2017-12-27

Android基于socket的TCP通信

基于socket套接字的TCP通信,定时发送心跳包以保持长连接,使用守护线程来守护心跳线程,保证心跳线程持续工作。如果断开连接,启动重连接机制,随着重连接次数增加,连接时间拉长,如果重连接次数达到10次,认为网络已断开,放弃连接服务端。(待完善,客户端离线消息应该使用数据库保存,等网络重新建立连接,推送给服务端。)

2017-04-16

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除