C++
//dll导入导出定义
extern "C" __declspec(dllexport)
extern "C" __declspec(dllimport)
#define DLLEXPORT __declspec(dllexport)
#define del(o) if(o){delete o;o=NULL;}
//callback 回调函数声名
BOOL __stdcall MyFunction(int value,void (__stdcall* MyCallBack)(int value));
typedef void(__stdcall *MyCallBack)(int iLevel);
DLLEXPORT void __stdcall MyFunction(int value);
C#
//c#调用win32 dll#
[DllImport("win32.dll",EntryPoint = "dll_functionname",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]
public static extern int dll_functionname(string str);
//c#定义回调
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void T_CB_OnMessage(UInt32 msg, UInt32 wparam, UInt32 lparam);
//c#与win32 dll对应的结构体定义
[StructLayout(LayoutKind.Sequential)]
public class Data
{
public Int32 m_iSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public Byte[] m_bytes;
}
//win32 dll传出地址转c# 结构体
Data data = new Data();
Marshal.PtrToStructure(ptr, data);
各厂摄像头的rtsp url
海康:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
说明:
username: 用户名。例如admin。
password: 密码。例如12345。
ip: 为设备IP。例如 192.0.0.64。
port: 端口号默认为554,若为默认可不填写。
codec:有h264、MPEG-4、mpeg4这几种。
channel: 通道号,起始为1。例如通道1,则为ch1。
subtype: 码流类型,主码流为main,辅码流为sub。
例如,请求海康摄像机通道1的主码流,Url如下
主码流:
rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream
rtsp://admin:12345@192.0.0.64:554/MPEG-4/ch1/main/av_stream
子码流:
rtsp://admin:12345@192.0.0.64/mpeg4/ch1/sub/av_stream
rtsp://admin:12345@192.0.0.64/h264/ch1/sub/av_stream
大华:
rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0
说明:
username: 用户名。例如admin。
password: 密码。例如admin。
ip: 为设备IP。例如 10.7.8.122。
port: 端口号默认为554,若为默认可不填写。
channel: 通道号,起始为1。例如通道2,则为channel=2。
subtype: 码流类型,主码流为0(即subtype=0),辅码流为1(即subtype=1)。
例如,请求某设备的通道2的辅码流,Url如下
rtsp://admin:admin@10.12.4.84:554/cam/realmonitor?channel=2&subtype=1
QT
QT 资源文件生成二进制文件,防止qrc资源文件生成过大(out of memory allocating)。
rcc -binary .\res.qrc -o newres.rcc
成员函数生成代码
alt+enter
windeployqt 依赖 windeployqt xxxx.exe
Linux
ubuntu 创建快捷方式 点击链接
ubuntu FTP GUI 安装命令:sudo apt-get install filezilla
导出函数命令:nm -D xxxx.so > xxxx.txt
执行文件elf信息: file xxxxx
查看依赖的库:objdump -x xxx.so | grep NEEDED
查看可执行程序依赖的库:objdump -x 可执行程序名 | grep NEEDED
查看缺少的库:ldd xxx.so,如果某个依赖的库不存在,会打印类似“xxx.so not found”的提示
在所有目录中查找xxx文件:find / -name xxx
Linux 批处理命令
将扩展名为lib的所有文件保存至txt
dir /b *.lib *>0.txt
按名字查找进程:ps -e | grep xxxx
进程完整信息:ps aux
系统启动项文件:/etc/rc.local
文件信息显示日期:ls -lh
Linux 守护进程
test.sh
#!/bin/bash
bin=/home/ros/test.out
while true;
do
server=`ps aux | grep $bin | grep -v grep`
if [ ! "$server" ]; then
nohup $bin &
fi
sleep 5
done
exit 0
deamon.sh
#!/bin/bash
nohup /home/ros/test.sh &
Linux 编译
linux so动态库的编译,声名时只需要用extern “C”{}把函数括起来
点击链接
ffmpeg android 平台编译
说明:
ffmpeg的编译可由gcc、clang两个编译器编译。clang较新,本文使用gcc进行编译。
编译环境:
ubuntu16.04
android-ndk-r16b ndk下载地址
ffmpeg 4.1.3 ffmpeg下载地址
从上面下载好需要的包,右键解压到对应目录
ndk目录例如:/home/cn/ffmpeg/android-ndk-r16b
ffmpeg目录例如:/home/cn/ffmpeg/ffmpeg
按上面环境路径,开始按下面的步骤执行
1、ndk的环境配置Linux Path路径,这一步很重要,gcc的编译在此生效
sudo gedit ~/.bashrc
最后加入一行 export PATH=$PATH:/home/cn/ffmpeg/android-ndk-r16b
ctrl+s 保存退出
2、进入ffmepg目录,将configure文件的以下内容
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
替换成
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
3、创建脚本,下面包含各平台的路径
终端至ffmepg源码目录
sudo gedit ./build_android.sh
make clean
NDK=/home/cn/ffmpeg/android-ndk-r16b
ARCH=arm
CPU=armv7-a
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-16/arch-$ARCH/
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-postproc \
--enable-shared \
--enable-jni \
--disable-x86asm \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=vp8_mediacodec \
--enable-decoder=vp9_mediacodec \
--disable-static \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS -I$NDK/sysroot/usr/include -I$NDK/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=16 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -U_FILE_OFFSET_BITS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
echo "The Compilation of FFmpeg for $CPU is completed"
make
make install
=========================================ARCH CPU配置===================================
#armv8-a
ARCH=arm64
CPU=armv8-a
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-21/arch-$ARCH/
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-21/arch-$ARCH/
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
#x86
ARCH=x86
CPU=x86
TOOLCHAIN=$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-21/arch-$ARCH/
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android
#x86_64
ARCH=x86_64
CPU=x86-64
TOOLCHAIN=$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64
SYSROOT=$NDK/platforms/android-21/arch-$ARCH/
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android
4、./configure执行
x86 执行 ./configure
arm 执行 ./configure --disable-x86asm 预生成config.mak文件否则./configure生成的是x86版本的so,
5、执行脚本
sudo ./build_android.sh
编译过程中出现的错误处理
编译过程中的错误代码 点击链接
6、ndk-build命令
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk
ffmpeg图像反转180度,图像颠倒的处理,加到avcodec_decode_video2之后
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, (AVPacket *)packet);
pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);
pFrame->linesize[0] *= -1;
pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[1] *= -1;
pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[2] *= -1;
Java Android
Android Studio 创建JNI 点击链接
资源
免费Git托管
GitHub 点击链接
GitLab 点击链接
码云 点击链接
腾讯开发者平台 点击链接
阿里云Code托管平台 点击链接
百度效率云 点击链接
Linux常用软件
terminator
VSCode插件
ssh插件
sftp 配置 点击查看