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:[email protected]:554/h264/ch1/main/av_stream
rtsp://admin:[email protected]:554/MPEG-4/ch1/main/av_stream
子碼流:
rtsp://admin:[email protected]/mpeg4/ch1/sub/av_stream
rtsp://admin:[email protected]/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:[email protected]: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 配置 點擊查看