xinayida

keep writing


  • 首页

  • 分类

  • 标签

  • 搜索

Gradle编译依赖冲突问题(AGPBI)

发表于 2018-11-30 | 更新于 2019-10-12

在出现依赖的库版本不一致的情况时,gradle会默认使用新版本覆盖旧版本,通常不需要手动去解决。那么出现冲突一般为当前工程的某个直接引用的库版本,低于依赖库/工程中依赖树的版本

  1. 将依赖关系打印到日志文件中: ./gradlew -q app:dependencies > dependencies.txt
  2. 试着将冲突的

局域网wifi环境Android摄像实时互传

发表于 2018-11-12 | 更新于 2021-01-02 | 分类于 java

简介

最近,项目中需要实现这样一个需求,局域网内两台设备,一台通过摄像头录像,并实时传输到另一台设备上显示,要求延迟在1秒之内。
调研了一下局域网内视频传输的东西,网上找了一些相关项目,找到的最接近需求的是Endoscope,只不过这个实现会有4-5秒的延迟,造成延迟的主要原因在于他是在录制端开启了一个rtsp服务:

StartStreamPresenter.java

1
2
3
4
5
private void startRtspServer() {
rtspServer = new RtspServer();
rtspServer.addCallbackListener(this);
rtspServer.start();
}

显示端使用Android原生MediaPlayer去链接视屏源并播放:

PlayerStreamActivity.java

1
mediaPlayer.setDataSource(this, videoUri);

通过调试发现视屏发送端在有客户端链接后,立即开始录制并输出视屏数据,怀疑是MediaPlayer的缓存机制导致了视频不同步的问题。

因此,在此基础上:

  • 我将视频传输协议改为tcp,发送的数据事先做了转换NV21->YUV420,并矫正了90度旋转(为了竖屏正常显示,摄像头需要设置为顺时针旋转90度)
  • 接收端改为通过硬件解码将视频数据包解析并渲染到SurfaceView上

##########################################

另,在网上看到很多实现方式是通过将每帧数据压缩为Jpeg格式之后传输、显示,这里我也将这种方式实现了一下,通过对比发现效果很不理想,可以通过修改DetectConst.TRANS_MODE来切换测试

源码:https://github.com/xinayida/LiveVideo

[译]Epoxy:Airbnb的安卓视图架构

发表于 2018-06-19 | 更新于 2018-09-05 | 分类于 android
Airbnb recycleriew architecture
阅读全文 »

ffmpeg编译

发表于 2018-05-23 | 更新于 2021-01-10 | 分类于 c++

1.Download

下载ndk: https://developer.android.google.cn/ndk/downloads/
下载ffmpeg: http://ffmpeg.org/download.html#releases

2.Config

./configure

1
2
3
4
5
6
7
8
9
10
#############
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
#############

add build_android.sh

chmod +x build_android.sh

打开并编辑build_android.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
#你自己的NDK路径。
export NDK=/Users/ww/workspace/tools/android-ndk-r15c
# 设置你的android平台编译器的版本 这里采用Android4.0
export SYSROOT=$NDK/platforms/android-18/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export PLATFORM=$NDK/platforms/android-18/arch-arm64/
export CPU=arm-v7
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--enable-decoder=h264 \
--enable-decoder=mp3 \
--enable-decoder=aac \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
--enable-libx264 \
--enable-libx265 \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I../x264/android/arm/include" \
--extra-ldflags="-L../x264/android/arm/lib" \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \

make clean
make
make install

./build_android.sh

Spring搭建微信后台

发表于 2018-05-17 | 更新于 2018-09-05 | 分类于 java

配置Mybatis

http://www.mybatis.org/spring/mappers.html#scan

http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

Hexo和Next主题如何使用

发表于 2018-05-09 | 更新于 2018-05-11

如何使用 Hexo 和 GitHub Pages 搭建这个博客
Next主题(Hexo)

Spring notes

发表于 2018-05-09 | 更新于 2018-09-05 | 分类于 java

javax.annotation.Resource和@Autowired区别

  • @Resource和@Autowired两者都是做bean的注入使用。
  • 其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入。但是Spring支持该注解的注入。
  • 共同点:两者都可以写在字段和setter方法上。两者如果都写在字段上,就不需要写写setter方法。

@Autowired

@Autowired为Spring提供的注解, 需导入Package:org.springframework.beans.factory.annotation.Autowired;
只按照byType 注入。

1
2
3
4
5
6
7
@Autowired 
private UserDao userDao;//用于字段上

@Autowired
public void setUserDao(UserDao userDao) {//用于属性的setter方法上
this.userDao= userDao;
}

@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
如果想使用按名称装配,可以结合@Qualifier注解一起使用。

1
2
@Autowired  @Qualifier("userDao")
private PersonDao personDao;
阅读全文 »

Go 基础知识

发表于 2018-05-09 | 更新于 2018-05-11 | 分类于 go

值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "fmt"
func main() {
// 字符串可以通过 + 连接。
fmt.Println("go" + "lang")

// 整数和浮点数
fmt.Println("1+1 =", 1+1)
fmt.Println("7.0/3.0 =", 7.0/3.0)

// 布尔型,还有你想要的逻辑运算符。
fmt.Println(true && false)
fmt.Println(true || false)
fmt.Println(!true)
}
1
2
3
4
5
6
golang
1+1 = 2
7.0/3.0 = 2.3333333333333335
false
true
false
阅读全文 »

xinayida

keep writing

8 日志
4 分类
9 标签
GitHub E-Mail 简书
Links
  • 5000rmb
© 2021 xinayida
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Mist v6.2.0