Mr.HeXiang Blog

记录学习,学习记录


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 公益404

ubuntu下编译ffmpeg

贺祥 | 发表于 2018-11-21 | 分类于 音视频
Ubuntu下编译ffmpeg

官网指导:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

下载源代码
1
git clone https://git.ffmpeg.org/gitweb/ffmpeg.git
切换分支

查看远程分支,切换release版本最新的分支到本地,为了稳定,编译少bug,选择release版本的

1
2
git branch -a
git checkout -b remotes/origin/release/4.1

在当前目录创建个bin文件夹,最为编译安装文件夹

1
mkdir bin
安装环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo apt-get update -qq && sudo apt-get -y install \
autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
pkg-config \
texinfo \
wget \
zlib1g-dev
1
2
sudo apt-get install nasm
sudo apt-get install yasm
阅读全文 »

内部类-局部内部类-匿名内部类

贺祥 | 发表于 2018-09-14 | 分类于 Android
内部类(常规内部类,静态内部类),局部内部类,匿名内部类。

下面的述语中,成员内部类是指常规内部类与静态内部类。

getDeclaringClass():Class<?>
获取成员内部类在定义时所在的类。

getEnclosingClass():Class<?>
获取内部类在定义时所在的类。

getEnclosingConstructor():Constructor
获取局部或匿名内部类在定义时所在的构造器。

getEnclosingMethod():Method
获取局部或匿名内部类在定义时所在的方法。

isMemberClass():boolean
查看是否成员内部类。

isLocalClass():boolean
查看是否局部内部类。

isAnonymousClass():boolean
查看是否匿名内部类。

例子:

阅读全文 »

ubuntu环境mosquitto安装及测试最大连接数

贺祥 | 发表于 2018-09-02 | 分类于 Android
ubuntu环境mosquitto安装及测试最大连接数
1
2
3
4
5
6
7
#!/bin/bash
c=1 -d
while [ $c -le 5000 ]
do
mosquitto_sub -d -t hexiang -k 900 &
(( c++ ))
done
查看连接数
1
netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
1
netstat -na|grep ESTAB|grep 1883|wc -l
查看cpu 占用高的线程
1
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
结束进程及所有连接
1
kill -9 `ps -ef|grep mosquitto|awk '{print $2}'`
1
2
3
4
#(max processes)
ulimit -u 12000
#(max files)
ulimit -n 12000
windows dos 命令查看 连接数
1
netstat -an|find ":1883" |find  "ESTABLISHED" /c

#####订阅远程主机
mosquitto_sub -h 192.168.11.16 -t hexiang

mosquitto安装错误处理

mosquitto: error while loading shared libraries: libwebsockets.so.4.0.0: cannot open shared object file: No such file or directory

1
sudo ln -s /usr/local/lib64/libwebsockets.so.4.0.0 /usr/lib/libwebsockets.so.4.0.0
mosquitto 脚本安装 for ubuntu
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/bin/sh
#print hello world in the console window
echo -e "开始安装-----------------------------------------------------------"
echo -e "author:hexiang"
echo -e "name:dz.hexiang"
echo -e "mail:472482006@qq.com"
echo -e "初始设置请稍等..."
sleep 3s


echo -e "开始安装wget下载工具"

yum -y install wget


echo -e "开始下载即时通信服务器源码..."
cd /home
wget http://mosquitto.org/files/source/mosquitto-1.4.9.tar.gz
echo -e "开始解压即时通信服务器源码..."
tar -xzvf mosquitto-1.4.9.tar.gz
cd mosquitto-1.4.9;

echo -e "开始进行配置..."

#WITH_SRV ,WITH_UUID,WITH_WEBSOCKETS
sed -i -E "s/^#WITH_SRV:=.*$/WITH_SRV:=yes/g" config.mk
sed -i -E "s/^WITH_SRV:=.*$/WITH_SRV:=yes/g" config.mk

sed -i -E "s/^#WITH_UUID:=.*$/WITH_UUID:=yes/g" config.mk
sed -i -E "s/^WITH_UUID:=.*$/WITH_UUID:=yes/g" config.mk

sed -i -E "s/^#WITH_WEBSOCKETS:=.*$/WITH_WEBSOCKETS:=yes/g" config.mk
sed -i -E "s/^WITH_WEBSOCKETS:=.*$/WITH_WEBSOCKETS:=yes/g" config.mk

echo -e "即时通信配置成功开始安装相关支持库..."
cd /home
wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
tar xvf c-ares-1.10.0.tar.gz
cd c-ares-1.10.0
./configure
make&make install


apt install libuuid-devel -y
apt install cmake -y
apt install uuid-dev -y

cd /home;
wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
tar zxvf v1.3-chrome37-firefox30.tar.gz
cd libwebsockets-1.3-chrome37-firefox30;
mkdir build; cd build;
cmake .. -DLIB_SUFFIX=64
make install



echo -e "即时通信开始编译安装..."
cd /home/mosquitto-1.4.9
make&make install

mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf


echo -e "配置相关信息..."
sed -i -E "s/^#autosave_interval 1800$/autosave_interval 1800/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^#persistence false$/persistence true/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^#persistence_file mosquitto.db$/persistence_file mosquitto.db/g" /etc/mosquitto/mosquitto.conf

sed -i -E "s/^autosave_interval 1800$/#autosave_interval 1800/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^persistence true$/#persistence true/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^persistence_file mosquitto.db$/#persistence_file mosquitto.db/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^persistence_location \/var\/mosquitto\/$/#persistence_location \/var\/mosquitto\//g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^listener 1883$/#listener 1883/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^listener 8888$/#listener 8888/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^protocol websockets$/#protocol websockets/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^user root$/#user root/g" /etc/mosquitto/mosquitto.conf
sed -i -E "s/^allow_anonymous true$/#allow_anonymous true/g" /etc/mosquitto/mosquitto.conf

sed -i -E '$ a autosave_interval 1800' /etc/mosquitto/mosquitto.conf
sed -i -E "$ a persistence true" /etc/mosquitto/mosquitto.conf
sed -i -E '$ a persistence_file mosquitto.db' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a persistence_location /var/mosquitto/' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a listener 1883' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a listener 8888' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a protocol websockets' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a user root' /etc/mosquitto/mosquitto.conf
sed -i -E '$ a allow_anonymous true' /etc/mosquitto/mosquitto.conf

#sed -i -E '$ a --------------' /etc/mosquitto/mosquitto.conf

touch /etc/ld.so.conf.d/liblocal.conf
#添加下面两行配置

echo -e '/usr/local/lib64\n/usr/local/lib'>/etc/ld.so.conf.d/liblocal.conf

#刷新
ldconfig

echo -e "启动即时通信服务..."
cd /usr/local/sbin
mosquitto -c /etc/mosquitto/mosquitto.conf -d


echo -e "-----------------------------------------------------------"
echo -e "配置防火墙..."


#安装iptables-services
yum install iptables-services -y
#启动firewalld服务
echo -e "设置开机启动防火墙..."
systemctl enable firewalld.service
echo -e "启动防火墙..."
systemctl start firewalld.service
echo -e "设置开机启动防火墙规则..."
systemctl enable iptables.service
echo -e "启动防火墙规则..."
systemctl start iptables.service
#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X

#所有计数器归0
iptables -Z
echo -e "开启各种服务端口..."
#开放1888 端口
iptables -A INPUT -p tcp --dport 1888 -j ACCEPT
#开放8888端口
iptables -A INPUT -p tcp --dport 1883 -j ACCEPT

iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
#开放8888端口

iptables -A INPUT -p udp --dport 5060 -j ACCEPT

#开放8888端口
iptables -A INPUT -p tcp --dport 8087 -j ACCEPT
iptables -A INPUT -p tcp --dport 8088 -j ACCEPT
iptables -A INPUT -p tcp --dport 8086 -j ACCEPT
iptables -A INPUT -p tcp --dport 8085 -j ACCEPT
iptables -A INPUT -p tcp --dport 1935 -j ACCEPT
#保存上述规则
service iptables save


#查看状态
systemctl restart iptables.service




echo -e "下面设置开机自动启动各种服务..."



#echo -e 'mosquitto -c /etc/mosquitto/mosquitto.conf -d\ncd /usr/local/sbin/ ; ./opensipsctl start\nsystemctl restart WowzaStreamingEngine.service\nsystemctl restart iptables.service'>/etc/rc.d/rc.local

#2.加入以下命令


chmod +x /etc/rc.d/rc.local
sed -i -E '$ a mosquitto -c \/etc\/mosquitto\/mosquitto.conf -d' /etc/rc.d/rc.local
sed -i -E '$ a cd \/usr\/local\/sbin\/ ; .\/opensipsctl start' /etc/rc.d/rc.local
sed -i -E '$ a systemctl restart iptables.service' /etc/rc.d/rc.local
sed -i -E '$ a systemctl restart WowzaStreamingEngine.service' /etc/rc.d/rc.local

懒人反编译辅助脚本工具

贺祥 | 发表于 2018-08-13 | 分类于 Android

simplyDecompile

懒人反编译辅助脚本

一、利用本辅助工具编译

https://github.com/dz-hexiang/simplyDecompile
本工具是利用apktool 和dex2jar进行反编译的。只是简化了步骤。

apktool 版本:2.3.3
d2j-dex2jar 版本:dex2jar-2.0

使用步骤:
  1. 把apk拷贝到根目录apk文件夹下(没有apk文件夹就创建个)
  2. 双击decompile.bat
  3. 输入apk的文件没名字按回车(输入几个字母按tab键会自动补全)

编译后会用jd-gui自行打开反编译后的jar文件。
反编译后的jar和资源在apk下对应的文件夹

二、 手动编译

apktool

1
2
#https://ibotpeaches.github.io/Apktool/install/
d2j-dex2jar -f ~/path/to/apk_to_decompile.apk

dex2jar

1
2
#https://github.com/pxb1988/dex2jar
apktool d testapp.apk

windows下安装mosquitto

贺祥 | 发表于 2018-07-09 | 分类于 Android
前言

一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。下面介绍如何在windwos下快速搭建代理服务器

阅读全文 »

阿里巴巴java开发规约插件使用

贺祥 | 发表于 2018-05-02 | 分类于 Android
一、前言

《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队为了提高效率,提高代码质量总结出的Java开发手册,阿里巴巴java开发规约插件主要支持(IDEA、Eclipse),Android Studio 是基于 IDEA 的,所以也是支持 Android 开发人员的

1.实时检测的功能,编写代码的同时也能快速发现不规范的代码。
2.扫描历史不规范代码,
3.批量一键修复,部分规则实现了批量一键修复的功能.

代码源码

https://github.com/alibaba/p3c

阅读全文 »

interface自定义注解

贺祥 | 发表于 2018-04-27 | 分类于 Android

@interface自定义注解

定义注解其实和定义接口差多不,interface前添加一个@符号

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum…)。可以通过default来声明参数的默认值

定义注解格式:
  public @interface 注解名 {定义体}

1
2
3
public @interface MyAnnotation{ 
   String value() default "";
}

通过反射获取到方法或者属性,然后通过getAnnotation方法获取对应的注解

MediaCodec音视频编码解码

贺祥 | 发表于 2018-02-07 | 分类于 Android

前言

MediaCodec是API 16之后Google推出的用于音视频编解码的一套可访问底层的媒体的API,可以直接利用硬件加速进行视频的编解码。调用的时候需要先初始化MediaCodec作为视频的编码器,然后只需要不停传入原始的YUV数据进入编码器就可以直接输出编码好的h264流。

通常与 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, and AudioTrack 一起结合使用

Alt text

阅读全文 »

调用jni的两种方法javah和RegisterNatives

贺祥 | 发表于 2018-02-03 | 分类于 JNI

前言:

调用jni的有两种方法:
一种是通过javah 自动生成jni文件
一种是加载类库的时候,调用JNIEnv 指针的RegisterNatives方法注册native方法

RegisterNatives方式有3种好处
1、jni种函数命名自由,不必像javah自动生成的函数声明那样,必须特定的命名方式;
2、效率高。传统方式下,Java类call本地函数时,通常是依靠VM去动态寻找.so中的本地函数(因此它们才需要特定规则的命名格式),而使用RegisterNatives将本地函数向VM进行登记,可以让其更有效率的找到函数;

3、运行时动态调整本地函数与Java函数值之间的映射关系,只需要多次call RegisterNatives()方法,并传入不同的映射表参数即可。

一、javah生成jni

  1. java类中声明 native 方法

    1
    public native String stringFromJNI();
  2. 通过javah方法生成jni文件。(cmd命令进入包根目录,javah 包名.类名)

生成方法会带JNIEXPORT void JNICALL 方法名很长,包名和native方法结合在一起。如:

1
2
3
4
5
6
7
8
9
10
//返回类型
JNIEXPORT jstring
JNICALL
//生成的方法名字
Java_libyuv_aimissu_com_libyuvtestdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

二、RegisterNatives 注册native方法

阅读全文 »

直播推流方案及过程分解

贺祥 | 发表于 2018-02-03 | 分类于 音视频

直播过程

1.相机预览及数据采集Camera — 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera))
2.原始帧处理(Rotate旋转/Scale缩放:使用Libyuv/FFmpeg等工具库)
3.编码器编码得到相应的h24数据(openh264库编码)
4.发送给流媒体服务器 (librtmp库推流)
5.服务器接受及转发

一、数据采集及预览

1.Surfaceview+Camera
2.GLSurfaceView +SurfaceTexture (openglees 做滤镜美颜功能)

二、原始帧处理

onPreviewFrame 默认得到的是NV21格式的数据,需要转换程I420
2.1转换I420(YUV420P)

为什么要使用转I420
1.Camera预览格式:NV21、YV12 ,默认是NV21 格式
2.H264编码必须要用 I420格式的YUV420

阅读全文 »

1…567…13
贺祥

贺祥

记学学记

123 日志
10 分类
65 标签
© 2023 贺祥
由 Hexo 强力驱动「Hosted by Coding Pages」
|
主题 — NexT.Pisces v5.1.3