书途

人无书而涂,因书而智,终老以书为伴,是为书途


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Android libyuv应用系列(一)Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别

发表于 2017-01-15   |   分类于 Android   |     |   阅读次数

项目中接触到图像处理这部分,需求是将手机摄像头采集的原始帧进行 Rotate (旋转)、Scale(拉伸)和 format convert(格式转换),无奈对此的了解甚少于是网上查阅资料恶补了一顿,完事后将最近所学总结一下以方便之后的人别踩太多。

首先想要了解YUV为何物,请猛戳:Video Rendering with 8-Bit YUV Formats.aspx) 链接中微软已经写的很详细了,国内大部分文章都是翻译这篇文章的,如果还有疑问的同学可以参考下面这些大神的博客:

  • 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
  • 图文详解YUV420数据格式
  • ANDROID 高性能图形处理 之 一. RENDERSCRIPT
阅读全文 »

Android实现录屏直播(二)需求才是硬道理之产品功能调研

发表于 2017-01-09   |   分类于 Android   |     |   阅读次数

请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244

Android实现录屏直播(一)ScreenRecorder的简单分析

Android实现录屏直播(二)需求才是硬道理之产品功能调研

Android实现录屏直播(三)MediaProjection + VirtualDisplay + librtmp + MediaCodec实现视频编码并推流到rtmp服务器

前面的Android实现录屏直播(一)ScreenRecorder的简单分析一文中我们对 ScreenRecorder 这个开源 Demo 中的实现机制大概有了了解,但在继续写这个系列文章的时候发现每一个细节都太紧密了,稍微不注意就会深入每个知识点的细节导致文章又臭又长还表述不清晰,于是我决定把这7天实现该功能的整个流程重新梳理一遍,按照我开发和研究学习的步骤来写,大致过程如下:

  1. 产品功能调研
  2. Bilibili 的反编译及 UI 的编写
  3. ScreenRecorder 等 Demo 的代码分析
  4. 对 H264 结构、FLV 格式封装的研究学习
  5. sps pps avcc 关键帧等视频封装原理的学习与分析
  6. MediaProjection 实现录屏中 MediaCodec 的详细用法
  7. 编码后的帧进行推流
阅读全文 »

Android实现录屏直播(一)ScreenRecorder的简单分析

发表于 2017-01-07   |     |   阅读次数

Android实现录屏直播(一)ScreenRecorder的简单分析

Android实现录屏直播(二)需求才是硬道理之产品功能调研

Android实现录屏直播(三)MediaProjection + VirtualDisplay + librtmp + MediaCodec实现视频编码并推流到rtmp服务器

应项目需求瞄准了Bilibili的录屏直播功能,基本就仿着做一个吧。研究后发现Bilibili是使用的MediaProjection 与 VirtualDisplay结合实现的,需要 Android 5.0 Lollipop API 21以上的系统才能使用。

其实官方提供的android-ScreenCapture这个Sample中已经有了MediaRecorder的实现与使用方式,还有使用MediaRecorder实现的录制屏幕到本地文件的Demo,从中我们都能了解这些API的使用。

而如果需要直播推流的话就需要自定义MediaCodec,再从MediaCodec进行编码后获取编码后的帧,免去了我们进行原始帧的采集的步骤省了不少事。可是问题来了,因为之前没有仔细了解H264文件的结构与FLV封装的相关技术,其中爬了不少坑,此后我会一一记录下来,希望对用到的朋友有帮助。

项目中对我参考意义最大的一个Demo是网友Yrom的GitHub项目ScreenRecorder,Demo中实现了录屏并将视频流存为本地的MP4文件(咳咳,其实Yrom就是Bilibili的员工吧?( ゜- ゜)つロ)😏。在此先大致分析一下该Demo的实现,之后我会再说明我的实现方式。

阅读全文 »

2016年终总结

发表于 2016-12-31   |   分类于 计划   |     |   阅读次数

img

在月初的时候我就写了一些年终总结,比较糙,也偏向于个人生活的事情。今天趁着2016的最后一天再将我的工作状态做个全面总结。其实在回想的时候真不敢相信一年内能做这么多事,我从一个外行到编程菜鸟彻彻底底的踏上了程序员的不归路。

阅读全文 »

工作一年后的状态与总结

发表于 2016-12-18   |     |   阅读次数

2016 发生了什么个人大事?

阅读全文 »

2016 Beijing GDG DevFest大会参后感

发表于 2016-11-25   |     |   阅读次数

GDG DevFest 2016 Beijing

前话

15年初的时候参加过一次GDG线下举办的一次分享会,因为当时是实习的公司提供的活动场地。有了那次机会后,就一直关注了GDG的活动。

参加的目的最重要的是本次大会是比较盛大的一场技术大会,在经过一年的创业公司的洗礼以后,成长正处于瓶颈期,迷茫却不知所措,本着充电的初衷报了名。

大会还赠送了礼品:

  • Android小机器人
  • Google Developer的纪念衫一件
  • 提供了午餐,茶歇有零食
阅读全文 »

修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题

发表于 2016-11-09   |     |   阅读次数

项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明了是因为UI层的问题导致的,需要自己排查。涉及到该问题的链接:

  • 通过ijkPlayer播放m3u8视频时快进不准确的解决方案

    http://www.jianshu.com/p/bc42ba6e4bf2

  • 为什么Sample里面的进度条,往前拖动进度条后,还会往后退几秒

    https://github.com/Bilibili/ijkplayer/issues/834

  • 向前拖动,进度条会往回跳

    https://github.com/Bilibili/ijkplayer/issues/313

    bbcallen commented on Jul 8, 2015

    UI部分seekbar的回调处理得不太合理,如果放手很快,最后一个位置不会被传给播放器,建议自行修改。

阅读全文 »

mac linux批量修改文件名

发表于 2016-11-05   |     |   阅读次数

我的mac使用命令行批量修改名字时发现居然没有rename的指令:

1
zsh: command not found: rename

所以使用HomeBrew先安装一下:

1
➜  ~ brew install rename

阅读全文 »

面试经验--乐视

发表于 2016-10-04   |     |   阅读次数

此次投的是三年经验的Android开发,最后反而因为自己的失误,没有准备充分而导致结果很悲剧,以此告诫自己千万不能疏忽大意。

阅读全文 »

Android5.0以下NoClassDefFoundError的Bug

发表于 2016-09-11   |   分类于 Android异常   |     |   阅读次数

大周末的,突然接到老大的电话说很多用户无法安装新上线的APK,让我紧急Fix(现Android项目就我一己之力)。但奇怪的是也没有Bug Reporter,而且开发过程中也一直没问题。根据上报的几个用户的机型,我初步推断都是5.0以下的设备无法启动App,通过云测和优测的真机模拟(在此强烈推荐这两个测试平台,前者是腾讯的,机型较新,后者做的规模还不错,测试较为准确,并且每天都有免费兼容测试的资格和限时免费的机型)打印出Log后得出判断,错误异常居然是这个:

1
java.lang.NoClassDefFoundError

这可就折腾了,因为Log打印的是某个类没有找到,开始以为是该类的代码问题,仔细检查后发现根本不应该是这个类引发的问题。而分别打的两个正式包(Mac和PC环境)设备报错都不是同一个类,刚开始Google的时候,关键字是NoClassDefFoundError android,SF上网友遇到的是Eclipse的路径配置问题,和我遇到的不是同一个Bug,就在希望快崩溃的时候,再次GoogleNoClassDefFoundError android studio发现该问题描述和我遇到的一模一样,回想前些日子遇到过Configure Apps with Over 64K Methods该问题,检查后发现Application并没继承MultiDexApplication,而build.gradle中依赖也没了,仅仅剩余下述开关multiDexEnabled true 。重新打包测试后果然是这个问题引发的血案,而出现这个问题是因为我和同事merge代码时候丢失部分修改导致的。

解决方法:

  1. 配置build.gradle (app)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...

// Enabling multidex support. 开关
multiDexEnabled true
}
...
}

dependencies {
// 添加依赖
compile 'com.android.support:multidex:1.0.0'
}
  1. 使用自定义的Application继承 MultiDexApplication 这个类,或者重写Application的方法attachBaseContext(),并调用MultiDex.install()
123
Codios

Codios

积跬步而至千里

29 日志
15 分类
39 标签
RSS
GitHub cnblogs Weibo
© 2018 Codios
由 Hexo 强力驱动
主题 - NexT.Pisces