- 博客(175)
- 资源 (48)
- 问答 (1)
- 收藏
- 关注
原创 FFmpeg结构体分析:AVFormatContext连接FFmpeg的桥梁
AVFormatContext对开发者开放,是连接开发者与FFmpeg内部的桥梁。结构体内部包含有AVInputFormat、AVOutputFormat、AVCodec、AVStream、AVDictionary、AVClass等。支持设置自定义IO、监听网络中断状态、设置options、直播秒开调优等。
2021-11-23 01:02:33 20075
原创 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 36734
原创 ijkplayer音视频同步策略分析
音视频同步是播放器的一道必选题,也是面试官常问的面试题。大家应该都知道音视频同步时钟有三种,默认使用音频时钟作为同步源。但是面试官会有其他变种问法:如果直播流的音频落后或者中断怎么办?如果没有音频流,以什么时钟作为同步源?如果有两个音频流(原声和伴奏的播放场景)怎么办?如果视频时间戳落后或者超前怎么办,不同落后程度怎么处理?如果设置倍速播放有没影响?
2021-11-21 00:01:19 37556
原创 ijkplayer视频解码播放架构分析
ijkplayer是一款跨平台播放器,支持Android与iOS播放,视频渲染使用OpenGL ES。Android端视频解码可以用mediacodec,而iOS端视频解码用VideoToolbox。而软解部分使用FFmpeg的avcodec。
2021-11-20 00:03:13 26209
原创 ijkplayer音频解码播放架构分析
ijkplayer是一款跨平台播放器,支持Android与iOS播放,音频解码默认使用FFmpeg的avcodec软解。Android端播放音频可以用OpenSL ES和AudioTrack,而iOS端播放音频默认使用AudioQueue。
2021-11-18 21:54:14 39200
原创 ijkplayer自定义协议播放加密视频
FFmpeg实现http、https、hls、tcp、rtmp、ftp这些标准协议,但是要播放加密视频怎么办呢?ijkplayer在FFmpeg的libavformat模块进行扩展ijkio、ijklongurl、ijktcphook、ijkhttphook,我们也可以在这个基础上,自定义协议来进行解密播放。主要基于URLProtocol和AVClass进行扩展,实现protocol对应的方法。
2021-11-15 19:31:31 27868
原创 ijkplayer的时序与状态图分析
ijkplayer底层基于FFmpeg的ffplay.c进行改造与扩展,中间层进行Android与iOS的适配,Android需要添加JNI接口,而iOS可以直接调用c/c++。IJK作为一款优秀的开源跨平台播放器,具备完整的状态机,而且播放时序清晰。
2021-11-15 00:10:17 36952
原创 ijkplayer的API详细介绍
ijkplayer是一款优秀的跨平台播放器,核心代码在ff_ffplay.c,然后ijkplayer.c对ff_ffplay.c进行封装。接下来要介绍的API基于ijkplayer.c,除了常用API,另外有IJKMeta、property、option。
2021-11-14 15:16:57 37273
原创 基于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 27591 11
原创 常见FFmpeg命令行全面分析
FFmpeg多媒体库支持的命令行调用分为三个模块:ffmpeg、ffprobe、ffplay。其中ffmpeg命令行常用于音视频剪切、转码、滤镜、拼接、混音、截图等;ffprobe用于检测多媒体流格式;ffplay用于播放视频。详情可查阅FFmpeg官方文档:https://ffmpeg.org/ffmpeg-all.html。............
2021-10-23 10:15:08 39382 2
原创 详细的FFmpeg编译流程与脚本分析
FFmpeg是一个跨平台的多媒体库,也是目前音视频领域应用最广泛的库。它包括llibavcodec、libavformat、libavutil、libavdevice、libavfilter、libswscale、libswresample、libpostproc等模块,其中avcodec用于编解码,avformat用于解封装,avutil是提供工具类,avdevice用于各平台的设备接入
2021-09-20 14:20:18 37454 4
原创 sox语音开源库的功能剖析
sox是一个跨平台的命令行工具,可以进行音频格式转换,也可以应用各种音效到文件中,还支持在大多数平台进行播放与录制,堪称音频界的瑞士军刀。接下来,我们详细介绍sox库支持的音频格式、支持的音效、常用的API、常用的命令行。
2021-09-13 19:06:45 38214
原创 Android图形渲染框架
Android图形渲染框架包括:Gralloc分配缓冲区,BufferQueue作为缓冲队列连接生产者与消费者,可以使用TextureView、SurfaceView和GlSurfaceView
2021-06-20 17:17:24 26186 2
原创 走进音视频的世界——新一代开源编解码器AV1
AOMedia Video 1(AV1)是一种开源、免版税的编解码器,最初设计用于Internet上的视频传输。它是由开放媒体联盟(AOMedia)于VP9的继任者开发的,成立于2015年,包括半导体公司,视频点播提供商,视频内容生产商,软件开发公司和网络浏览器供应商。AV1比特流规范包括参考视频编解码器。AV1参考编码器分别比libvpx-vp9,x264高配置文件和x264主配置文件分别实现了34%,46.2%和50.3%的数据压缩。像VP9一样,但与H.264 / AVC和HEVC不同,AV1具有免版
2021-02-14 13:17:54 89874
原创 走进音视频的世界——Matroska封装格式的介绍(二)
Matroska封装格式非常灵活、兼容性好,既适用于本地文件存储又可以进行实时流传输。本篇文章主要探讨Matroska的编解码器映射,如何封装视频流、音频流、字幕流。如果要Matroska的介绍、功能和基本结构,请查看上一篇文章:走进音视频的世界——Matroska封装格式的介绍(一)。一、Matroska流Matroska有两种传输流:文件访问(存储)和实时流传输(直播)。1. 文件存储Matroska是一种容器,支持把多媒体流封装成为文件,存储于本地。Matroska的开销很小,非常适合
2021-02-12 20:58:47 30757 1
原创 走进音视频的世界——Matroska封装格式的介绍(一)
Matroska是一个开放标准项目,基于EBML(Extensible Binary Meta Language 可扩展的二进制元语言),旨在成为多媒体格式容器的标准。EBML与XML结构有点类似,RFC8794有详细介绍,在将来的格式可扩展性方面具有显着的优势,可以兼容旧容器中的文件解析。1、Matroska功能Matroska的设计着眼于未来,它具有如下功能:在文件中快速查找 章节条目 完整的元数据(标签)支持 可选字幕/音频/视频流 模块化可扩展 错误恢复能力(即使流损坏也可以恢
2021-02-11 19:42:26 32166 2
原创 走进音视频的世界——杜比视界Dolby Vision与HDR
Dolby Vision(杜比视界)是杜比实验室推出的影像画质技术,具有更宽的色域和高动态范围HDR,亮度、色度和对比度更加逼真,从而使得整体图像更加生动。图像的明亮部分可以变得更亮,因此图像似乎具有更多的“深度”。颜色被扩展以显示更多明亮的蓝色,绿色,红色以及介于两者之间的所有颜色。一、杜比视界如下图所示,左边是具有dolby vision效果的图片,右边是普通拍摄出来的图片:杜比视界的突出特点:1、多一半的色彩:当今电视只能显示 33% 的色彩。杜比视界 (Dolby Vision)
2021-02-06 00:14:12 36283 2
原创 走进音视频的世界——杜比音效之AC3与AC4
杜比音效是由杜比实验室开发的,涉及多声道音频压缩技术。这种数字压缩技术目标是生成数字音频信号,当解码重现时,声音与原始信号相同。同时使用最低码率进行压缩,提供真实的立体环绕声。因此,杜比音效广泛应用于电影院、家庭影音、DVD、蓝光光盘。杜比音效系列主要包括:Dolby AC3、Dolby AC3 Plus、Dolby AC4和Dolby TrueHD。杜比实验室发布的环绕声系统历史演进如下表所示:解码器 编码器 年 描述 频道 杜比立体声 杜比MP矩阵 1975年
2021-02-03 20:56:29 45683 3
原创 走进音视频的世界——剖析exo播放器架构
ExoPlayer是Google开源的一款播放器,基于Android平台的可扩展多媒体播放器,支持HLS流、Smooth Streaming流、Dash流,支持扩展FFmpeg、Vpx、Av1、Flac、Opus等软件解码器。GitHub地址:https://github.com/google/ExoPlayer;开发者指南文档:https://exoplayer.dev/;API介绍文档:https://exoplayer.dev/doc/reference/overview-summary.html;另
2021-02-02 00:26:26 34877 3
原创 深入理解TCP发送速率控制协议
TCP Friendly Rate Control(TFRC),是网络环境下单播流的一种拥塞控制机制。对于TCP流,它是公平竞争带宽的。但是与TCP相比,吞吐量随时间的变化要小得多,也就是对带宽变化的响应比TCP慢,使其更适用于电话通信、流媒体等需要相对平滑发送速率的应用。因此,TFRC仅用于需要平滑吞吐量时,尤其是避免TCP响应单个丢包而将发送速率减半。推荐使用TCP发送尽可能多的数据包,或者不需要可靠机制,可以使用加法增加、乘法减小(AIMD)的拥塞控制方案,与TCP使用的参数类似。TFRC是为发送固定
2021-01-27 20:57:23 33633
原创 2020Google开发者大会总结
今年比较特殊,由于疫情原因,Google开发者大会改为线上形式。但是依然如期举办,热情不减,今年核心主题是“代码不止”,分为6场线上科技盛会。11月16日,主题演讲,由Google大中华区总裁陈俊廷作主题报告;17日,主题是“更卓越的开发体验”,包括Android、Google Play、Chrome OS的性能改进;18日,主题是“高效的前端开发”,包括Flutter、Web.dev、Material Design高效的跨平台渲染;19日,主题是“机器学习技术”,包括TensorFlow与Google女性
2020-11-23 00:54:59 12259 6
原创 那些年曾经看过的书——工作篇
工作以后,主要是看一些与工作相关的书,比如Android相关:Android开发艺术探索、深入理解Android内核设计思想、Android C++高级编程。音视频相关:FFmpeg从入门到精通、WebRTC Native开发实战、OpenGL ES3.0编程指南、音视频开发进阶指南、在线视频技术精要。语言相关:C++ Primer Plus、Java编程思想。操作系统/虚拟机相关:深入理解Java虚拟机、深入理解计算机系统。其他书籍:雷军传、硅谷之火、程序员自我修养、卓有成效的管理者等。
2020-11-07 16:00:44 20793 14
原创 Android音视频全面介绍与代码实践之音效(四)
Android在应用层提供丰富的多媒体接口,本文主要介绍音效处理:均衡器风格、预设混响、重低音调节、音量增强、可视化动态频谱,这些音效都使用audioSessionId进行绑定。让用户可选择/设置自己喜欢的风格,身临其境地感受不同歌曲的跳动旋律。方便开发者进行二次开发,打造出酷炫的音乐播放器。
2020-10-21 09:00:28 21892 2
原创 走进音视频的世界——音视频解码
音视频文件是经过编码、封装而成的。那么反过来,要播放音视频文件,首先得解封装、解码。上一篇博客讨论到音视频编码:https://blog.csdn.net/u011686167/article/details/108590762,我们来个上下呼应,本文与大家探讨一下音视频解码。本质上,是按照既定的解码协议去解析编码内容,也就是编码的逆过程。常见的视频解码器有:H264、H265、VP8、VP9、MPEG4、MJPEG、WMV3、MSMPEG4V3,常见的音频解码器有:MP3、AAC、FLAC、AC3、OPU
2020-09-29 00:13:02 23152
原创 走进音视频的世界——音视频编码
音视频流是通过特定编码器压缩,由一系列的压缩图像/语音帧组成。当然可能存在多种语言多音轨,每个音轨之间的音频流相互独立。还可能存在内置字幕,常见的字幕格式有sub、smi、ssa、srt等。但是,本篇文章讨论的主角是音视频编码,常见的视频编码有h264、h265、vp9、mpeg4、mjpeg、wmv3、av1(Alliance for Open Media Video 1,由开放媒体联盟推出,对标h265,旨在成为下一代视频编码技术标准),常见的音频编码有mp3、aac、amr_nb、amr_wb、ac3
2020-09-19 00:00:45 24678
原创 走进音视频的世界——音频封装格式
音频封装格式一般由:多媒体信息+音频流+封面流+歌词流组成。有些音乐会包含封面和歌词,则对应有封面流、歌词流。多媒体信息包括:标题、艺术家、专辑、作曲、音乐风格、日期、码率、时长、声道布局、采样率、音频编码器等。而音频封装包括:mp3、m4a、ogg、amr、wma、aac、wav、flac、ape等。前面两篇文章介绍过相关概念走进:音视频世界——音视频的基本概念、走进音视频世界——视频封装格式。以下面问题为出发点,揭开音频封装格式的面纱:① 音乐封面如何获取?② 音乐歌词如何获取与显示?.
2020-09-14 22:07:42 26215
原创 走进音视频的世界——视频封装格式
音视频的时长怎么获取,音视频的封面怎么获取,音视频的格式怎么获取呢?这些信息都以特定格式存储在文件开头或者结尾,称为多媒体信息或者多媒体元数据。通用的封装格式由:文件标识头+多媒体信息+音视频(字幕)轨+视频帧索引块组成,如果是纯音频,后面可能还有歌词。音视频的封装格式就是通过解析文件标识头进行判断的,然后解析多媒体信息从而获取时长,再解析视频帧索引块,最后根据索引块去获取对应时间戳的视频帧。音视频封装格式存储的字段包括:时长、码率、音视频编码器、分辨率(宽x高)、帧率、像素格式、旋转角度、采...
2020-09-08 00:37:05 26041
原创 走进音视频的世界——音视频的基本概念
音视频通用的基本概念有码率、时长,而不同音视频有不同的封装格式、编码协议。其中视频关键参数有分辨率、帧率、画质、旋转角度、像素格式,而音频关键参数有采样率、声道数、声道布局、音质、采样数、采样位数、帧时长。接下来与大家详细探讨。...
2020-08-31 01:35:02 29676 8
原创 五种方案实现视频镜像
视频镜像一般是指,以视频x轴中心点为对称轴,左右内容互相交换。实现视频镜像功能,可以从解码层、渲染层、显示层这三个层次入手。解码层需要对解码出来的每一帧进行镜像处理,以FFmpeg软解处理为例,比较耗时,也占用更多内存空间,从性能效率角度考虑不太可取。但是,可以同时添加滤镜、模糊效果、文字与动画贴纸等等。当然,渲染层使用openGL也可以实现这些功能,同时也可以做镜像。显示层如果使用TextureView,可以通过设置旋转实现镜像,用法最为简单。一、显示层视频播放一般使用SurfaceView、GL
2020-08-28 00:44:40 30754 11
原创 NDK编译脚本:Android.mk or CMakeLists.txt
Android NDK以前默认使用Android.mk与Application.mk进行构建,但是在Android Studio2.2之后推荐使用CMake进行编译。Cmake是跨平台编译工具,全称为cross platform make,内建c、c++、java自动相依性分析功能,关于Cmake更多详情请参考官网:https://cmake.org/documentation/。下面我们对比下Android.mk与CmakeLists.txt的语法。一、Android.mk语法以动态库编译hell
2020-05-31 23:10:00 33083
原创 掌握这些概念,不用担心看不懂OpenGL ES着色语言了
在OpenGL ES图形学中,着色语言(Shading Language)是一门必修课。在看openGL代码时,都会有着色语言的身影,它有自己的一套语法和格式。提供给我们进行编程的包括顶点着色器和片元着色器,它们都遵循着色语言语法。...
2020-04-01 00:50:17 46547 2
原创 FFmpeg之FFprobe检测多媒体格式
FFmpeg里面有一个模块FFprobe(https://ffmpeg.org/ffprobe.html)专门用来检测多媒体格式数据,它的作用类似Android中的MediaMetadataRetriever。FFprobe支持检测format、streams、frames,用法与FFmpeg类似,我们可以单独使用,也可以结合在一起使用,下面举例说明一下:1、format仅是显示forma...
2020-01-12 23:43:50 44185
原创 Android播放器拖动进度条的小图预览
播放器拖动预览,让用户提前了解视频的波澜迭起情节,先走马观花看一遍精彩部分,满足一下好奇心,这就是拖动预览的意义所在。那么我们该如何打造高性能、高效率、高可靠的拖动预览呢?首先,小图预览强调足够小,因为预览画面分辨率没必要高清,分辨率越小解码速度越快、占用内存与CPU资源越低;其次,硬解优先,绑定Surface,解码后直接渲染到Surface上;另外,不必要解码音频,视频帧也可以选择性解码,比如只...
2019-11-19 01:51:32 38358
原创 Android悬浮窗播放视频
大家应该很喜欢这样的场景:一边打游戏一边看视频,生活娱乐两不误。这样应该怎么去实现呢?Android有提供悬浮窗API,使用悬浮窗播放视频,可以悬浮在其他应用上。有人可能会说,悬浮窗是不是会遮挡界面,导致用户体验不够好。总是有办法解决的,我们可以设计一个灵活的悬浮窗,窗口可以随时调整大小、任意拖动位置,这样就完美了。让我们看看小窗口播放效果。首先,需要在Manifest.xml里申请权限:...
2019-08-02 01:03:18 38881 3
原创 我们需要掌握的Kotlin之各种函数
Kotlin的函数可以定义在文件顶部,也就是说不需要创建一个类来持有一个函数。另外,Kotlin函数还包括:本地函数、成员函数、扩展函数、内联函数、高阶函数、泛型函数、递归函数。一、本地函数本地函数是函数内部包含另一个函数,也就是函数嵌套,示例代码如下:fun dfs(graph: Graph) { fun dfs(current: Vertex, visited: Set&...
2019-05-26 23:50:46 35302
原创 Flutter之我们需要掌握的知识点
Flutter是一套高效的跨平台免费开源SDK,可支持在移动端的Android、iOS进行开发,也支持Web桌面端、嵌入式界面开发。现在已经更新到1.5版本,下面来介绍Flutter概念、Flutter能够做什么、Flutter使用什么语言开发、Flutter框架、Flutter构建原理、Flutter如何在Android与iOS运行等等。一、Flutter是什么Flutter是Googl...
2019-05-12 22:31:01 35721
原创 Android Q之气泡弹窗
在Android Q中,用户可以借助气泡,轻松地在设备上任何位置进行多任务处理。气泡内置于“通知”系统中,它会浮动在其他应用的上层,并会跟随用户的移动而移动到屏幕的任何位置,用于取代SYSTEM_ALERT_WINDOW。气泡可以展开显示应用功能和信息,并在不使用时折叠起来。当设备处于已锁定状态或始终保持活动状态,气泡会像通知那样显示。气泡弹窗效果如下图:一、气泡配置信息气泡是一种可...
2019-05-11 23:51:54 39106
原创 Android Q沙盒机制之分区存储
为了让用户更好地控制自己的文件,Android Q更改了应用访问设备外部存储空间中文件的方式。Android Q用更精细的媒体特定权限来替换READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己在外部存储设备的文件。1、针对应用私有文件的隔离存储沙盒对于每个应用,Android Q 都会创建一个“隔离存储沙盒”,以限...
2019-05-11 12:56:48 43062 3
仿微信底部栏透明度渐变效果并且带红点提醒和未读数统计
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关注的人