CODE 備忘

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 配置 點擊查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章