Okhttp超时时间和连接复用逻辑
OkHttp 超时设置1234@get:JvmName("callTimeoutMillis") val callTimeoutMillis: Int = builder.callTimeout@get:JvmName("connectTimeoutMillis") val connectTimeoutMillis: Int = builder.connectTimeout@get:JvmName("readTimeoutMillis") val readTimeoutMillis: Int = builder.readTimeout@get:JvmName("writeTimeoutMillis") val writeTimeoutMillis: Int = builder.writeTimeout
这些存在于 OkHttpClient.Builder。
callTimeoutMillis 代表调用的超时时间,默认情况下不会超时。
connectTimeoutMillis、readTimeoutMill ...
Ffprobe 常用命令
ffprobe 官方文档在这 http://www.ffmpeg.org/ffprobe-all.html,参数很多,没必要都知道,掌握几个常用的就可以了。
常用命令查看简单的文件信息1ffprobe input.mp4
可以看到整体的信息大致分为两部分,从头到 Input #0 这里属于 ffprobe 的较少信息,无论你使用什么命令都会带出来,而且很占空间,你可以使用 -hide_banner 来隐藏它。
1ffprobe -hide_banner input.mp4
查看视频的封装格式1ffprobe -show_format input.mp4
字段
解释
filename
文件名
nb_streams
流的个数
format_name
封装格式
start_time
开始时间,单位为秒
duration
时长,单位为秒
size
文件体积,单位为比特
bit_rate
码率,单位为 b/s
probe_score
探测分数
查看视频的流信息1ffprobe -show_streams input.mp4
字段
解 ...
FFmpeg 常用命令
此篇文章只列举常见命令,不进行详细解释。
视频调整裁剪视频时长1ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
-ss 指定从什么时间开始
-t 指定需要截取多长时间
-i 指定输入文件
缩放视频1ffmpeg -i big.mov -vf scale=360:-1 small.mov
-vf 表示对视频应用 Video Filter,可应用多个 filter,中间用,隔开并用""包起来
注意 sacle 值必须是偶数,这里的 -1 表示保持长宽比,根据宽度值自适应高度。如果要求压缩出来的视频尺寸长宽都保持为偶数,可以使用 -2
旋转视频1ffmpeg -i input.mp4 -acodec copy -vcodec libx264 -b 800k -vf transpose=1 output.mp4
transpose=1 表示顺时针转 90°
transpose=2 表示逆时针旋转90°
transpose=3 表示先顺时针旋转90°, ...
Android SDK 上传 Maven 喂奶级教程
最近领导给安排了个任务,让我把我们现有的一个 SDK 上传到 Maven 上去,方便客户直接用 gradle 依赖,不再需要拷贝 jar 和 so 了,此前我也看过一些相关的文章我想问题也不大,觉得工作量也就一两天的事情,主要的难点在于如何隐藏源码上传 maven(因为是商业 SDK),万万没想到问题这么多,网上有用的文章也很少,加上 gradle 的版本捣捣乱让我整整一周焦头烂额,一言难尽,略过,直接进入正题!
前期准备AndroidStudio 版本(不同版本默认的 gradle 版本不同)
Gradle 版本12classpath 'com.android.tools.build:gradle:4.1.3'distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
总体流程
注册 sonatype 账号并申请 groupid
压缩 jar、so、其它资源到 aar
编写 gradle 脚本
解决源码混淆问题(非商用 SDK 可跳过)
解决文档 javadoc ...
C++基础(二)
此篇文章是本人学习 C++ 时所记录,不是正规教程,阅读需要有一定的编程基础。学习 C++ 之前最好先学一点 C,这样上手更快,这是我的 C 语言基础练习程序。这里还有一些额外的 C++ 练习程序,适合伴随本文章阅读。
标识符标识符编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而要做到这一点并非那么容易, 有时甚至根本做不到。为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如 double )不同,auto 让编译器通过初始值来推算变量的类型。显然,auto 定义的变量必须有初始值:
12// 由 vall 和 val2 相加的结果可以推断出 item 的类型auto item = vall + val2; // item 初始化为 vall 和 val2 相加的结果
编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。
设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。 ...
C++基础(一)
此篇文章是本人学习 C++ 时所记录,不是正规教程,阅读需要有一定的编程基础。学习 C++ 之前最好先学一点 C,这样上手更快,这是我的 C 语言基础练习程序。这里还有一些额外的 C++ 练习程序,适合伴随本文章阅读。
变量类型和 C 语言一样,C++ 的设计准则之一也是尽可能地接近硬件。C++ 的算术类型必须满足各种硬件特质,所以它们常常显得繁杂而令人不知所措。事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择的过程。以下是选择类型的一些经验准则:
当明确知晓数值不可能为负时,选用无符号类型。
使用 int 执行整数运算。在实际应用中,short 常常显得太小而 long 一般和 int 有一样的尺寸。如果你的数值超过了 int 的表示范围,选用 long long。
在算术表达式中不要使用 char 或 bool,只有在存放字符或布尔值时才使用它们。因为类型 char 在一些机器上是有符号的,而在另一些机器上又是无符号的,所以如果使用 char 进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定它的类型是 signed char 或者 ...
BottomSheetDialog布局异常问题
现象:在 xml 中指定了 android:layout_width="match_parent" 但 BottomSheetDialog 依然无法横向填充整个屏幕
原因:首先 BottomSheetDialog 它只是一个 Dialog,继承于 Dialog ,所以有和 Dialog 相同的特性,和普通 Dialog 显示视图的方式相同。设置视图使用的是 setContentView 方法,将视图或者视图 id 传入,它会将给定的视图填充到 layout.design_bottom_sheet_dialog 中 id 为 design_bottom_sheet 的 FrameLayout 中,且它的上级视图的宽度都为 match_parent在 onCreate 中会将该视图依附的 window 的 layout 的宽高都设置为 match_parent :window.setLayout(-1, -1)。继续往上追溯,Activity 与 Dialog 都是一个 Window 所依附 ,从他们的 style 中来看,找到 Dialog 默认的 style : ...
RTMP 设计思想
RTMP 传输基本流程
发送端:
Step 1: 把数据封装成消息(Message)。
Step 2: 把消息分割成消息块(Chunk, 网络中实际传输的内容)。
Step 3: 将分割后的消息块(Chunk)通过TCP协议发送出去。
接收端:
Step 1: 在通过TCP协议收到数据后, 先将消息块重新组合成消息(Message)。
Step 2: 通过对消息进行解封装处理就可以恢复出数据。
RTMP 设计思想
大而化小 轻车简行RTMP 协议中基本的数据单元称为消息(Message)。在互联网中传输数据时, 消息(Message)会被拆分成更小的单元, 称为消息块(Chunk).大的 Message 被切割成利于在网络上传输的小 Chunk,个人认为这是 RTMP 之所以延时低的核心原因。
切成小块, 还可防止大的数据块(如视频数据)阻塞小的数据块(如音频数据或控制信息)。
本是天涯同路人 你方唱罢我登场RTMP 基于 TCP 协议,包括控制信息、视频数据、音频数据都共用同一个 TCP Connection。也就是说路只有一条。而且同一时间只允许一辆车通过。生成好的视频 ...
程序员的哲思录
生活感悟
有时候体制的创新比建立技术护城河重要的多。
一想到为人父母不需要经过考试就觉得很可怕,很多父母并不知道如何为人父母,只是自私自利,冠冕堂皇罢了。
每天7点半准时坐在电视前,幸福感以方程式增长。
如果一个人的认知远远超过他的能力就会变得浮躁。
你懂的越多,懂你的人越少。
美貌十分肤浅,如果真的那么肤浅,为什么大多数人看不穿它。
我们注定要失去所爱之人,不然我们怎么知道他们在我们生命中有多重要。
四平八稳的日子里,谁都能讲几句大道理,主张人权,占领道德高地很简单,但当暴风雨来临之时,人们就慌了手脚,再无力顾及所谓的正确,只能随波逐流,人就是这样。
人间的苦难见得多了 就没有办法再轻飘飘地对人说出“活该”两个字,哪怕是做错了事的人。
结婚若是为了维持生计,那婚姻就是长期卖淫。
老年人相信一切,中年人怀疑一切,青年人什么都懂。
我们听到的一切都是一个观点,不是事实, 我们看到的一切都是一个视角,不是真相。
我不敢下苦功琢磨自己,怕终于知道自己并非珠玉,然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。
群体只会干两种事——锦上添花或落井下石。
我们很少信任比我们好的人,宁肯避免与他们来 ...