Application – FFmpeg transcode

18 二月, 2019

簡述

有一些影片, 想要用 FFmpeg 轉檔成 H.265 減少占用空間.

 

Compile gpac

https://gpac.wp.imt.fr/downloads/gpac-0.7.0.tar.gz

Install libavdevice-dev

$ sudo apt-get install libavdevice-dev

$ cd gpac-0.7.0

$ make

Compile & Install x264

$ git clone git://git.videolan.org/x264.git

$ cd x264

./configure \
–prefix=/home/nick/work/package/install/x264 \
–enable-shared \
–enable-static \
–disable-cli \
–disable-asm \
–disable-opencl \
–disable-avs \
–disable-ffms \
–disable-lavf \
–disable-swscale

make
make install

Compile & Install x265

從以下連結下載 https://bitbucket.org/multicoreware/x265/downloads/x265_3.0.tar.gz

$ tar -zxvf x265_3.0.tar.gz

$ cd x265_3.0/build/linux

$ cmake -G “Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
-DENABLE_SHARED=off   \
../../source

$ make
$ make install

執行

x265 一直裝不起來. 不知道問題在哪邊. 先用 x264 測試看看.

${FFMPEG_PATH}/bin/ffmpeg -i $1 -c:v libx264 -c:a aac -b:a 128k $1.mp4

 

 

 

 

 

 

 

Application – background remove

5 二月, 2019

簡述

在 Camera ( embedded Linux ) 上, 建置 OpenCV 4.0 做 background remove, motion detect

由於過程比較複雜, 先在 desktop 上完成, 再移植到 camera.

Desktop (Ubuntu 16.04)

  • 安裝相依性檔案
  • 編譯 OpenCV 4.0.1
  • 測試 JPEG 轉檔
  • 測試 WebCam 抓取影像
  • 測試 Background Removal

 

安裝相依性檔案

$ sudo apt-get install build-essential cmake libavcodec-dev libavformat-dev libswscale-dev1
$ sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libeigen3-dev  libvorbis-dev libxvidcore-dev libx264-dev libfaac-dev libavutil-dev libavfilter-dev libavresample-dev

編譯 OpenCV 4.0

cmake        \
-DCMAKE_BUILD_TYPE=RELEASE                  \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}               \
-DBUILD_JASPER=ON     \
-DBUILD_JPEG=ON     \
-DBUILD_PNG=ON     \
-DBUILD_TIFF=ON        \
-DBUILD_TBB=OFF     \
-DBUILD_TESTS=OFF     \
-DBUILD_ZLIB=ON     \
-DBUILD_PERF_TESTS=OFF    \
-DBUILD_SHARED_LIBS=OFF    \
-DBUILD_opencv_world=ON    \
-DENABLE_AVX=OFF     \
-DENABLE_CX11=ON     \
-DWITH_CUDA=OFF     \
-DWITH_OPENGL=OFF     \
-DWITH_OPENCL=OFF     \
-DWITH_IPP=OFF     \
-DWITH_JASPER=ON     \
-DWITH_JPEG=ON     \
-DWITH_PNG=ON     \
-DWITH_TBB=OFF     \
-DWITH_EIGEN=OFF     \
-DWITH_V4L=OFF     \
-DWITH_VTK=OFF     \
-DWITH_ZLIB=ON     \
..

測試JPEG轉檔

測試程式

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
cv::Mat image;

image = cv::imread(“sample.jpeg", cv::IMREAD_COLOR);

if ( ! image.data)
{
std::cout << “Could not open or find the image" << std::endl;
return -1;
}

cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
imwrite(“gray.jpeg", gray);

return 0;
}

編譯測試程式

g++ -std=c++11 $1.cpp  \
-I/home/nick/work/package/install/opencv_4.0.1/include/opencv4 \
-L/home/nick/work/package/install/opencv_4.0.1/lib/ \
-L/home/nick/work/package/install/opencv_4.0.1/lib/opencv4/3rdparty\
-lopencv_world \
-lIlmImf -littnotify -llibtiff -llibjasper -llibjpeg-turbo -llibpng -llibwebp -lzlib \
-lpthread -ldl \
-o $1

測試 WebCam 抓取影像

VideoCapture 會連結到 FFMPEG, 所以需要更改 OpenCV 的編譯設定, 安裝 FFMPEG. OpenCV 會連結到 FFMPEG, 因此, FFMPEG 要在 OpenCV 之前建置.

安裝 FFMPGE

download from https://www.ffmpeg.org/download.html

$ tar -xjf ffmpeg-4.1.tar.bz2

$ cd ffmpeg-4.1

./configure \
–prefix=/home/nick/work/package/install/ffmpeg-4.1 \
–enable-shared \
–disable-static \
–enable-gpl \
–enable-nonfree \
–enable-ffmpeg \
–enable-ffprobe \
–enable-swscale \
–enable-pthreads \
–disable-x86asm \
–disable-stripping \
–disable-libx264 \
–disable-libxvid \
–disable-lzma \

make
make install

重建 OpenCV

BUILD_DIR="${PWD}/build"
INSTALL_DIR="${PWD}/../install/opencv_4.0.1″

mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nick/work/package/install/ffmpeg-4.1/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nick/work/package/install/ffmpeg-4.1/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/home/nick/work/package/install/ffmpeg-4.1/lib

cmake        \
-DCMAKE_BUILD_TYPE=RELEASE                  \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}               \
-DBUILD_FFMPEG=ON     \
-DBUILD_JASPER=ON     \
-DBUILD_JPEG=ON     \
-DBUILD_PNG=ON     \
-DBUILD_TIFF=ON        \
-DBUILD_TBB=OFF     \
-DBUILD_TESTS=OFF     \
-DBUILD_ZLIB=ON     \
-DBUILD_PERF_TESTS=OFF    \
-DBUILD_SHARED_LIBS=OFF    \
-DBUILD_opencv_world=ON    \
-DENABLE_CX11=ON     \
-DWITH_CUDA=OFF     \
-DWITH_FFMPEG=ON     \
-DWITH_OPENGL=OFF     \
-DWITH_OPENCL=OFF     \
-DWITH_IPP=OFF     \
-DWITH_JASPER=ON     \
-DWITH_JPEG=ON     \
-DWITH_PNG=ON     \
-DWITH_TBB=OFF     \
-DWITH_EIGEN=OFF     \
-DWITH_V4L=ON     \
-DWITH_LIBV4L=ON     \
-DWITH_VTK=OFF     \
-DWITH_ZLIB=ON     \
..

make

重建 OpenCV 之後, 就可以正常執行從 V4L2 抓取影像的 測試程式. 原始碼

#include <opencv2/opencv.hpp>
#include <iostream>

const static char* AVI_FILE = “wnz-440.avi";
const static char* VIDEO_DEV = “/dev/video0″;

int main(int argc, char** argv)
{

std::cerr << “Init" << std::endl;

cv::VideoCapture capture(VIDEO_DEV);

if ( !capture.isOpened())
{
std::cerr << “Open camera failed" << std::endl;
return -1;
}
cv::Mat frame;
capture >> frame;

if ( frame.empty())
{
std::cerr << “Frame empty" << std::endl;
return -1;
}

imwrite(“capture.jpg", frame);
return 0;
}

編譯命令

g++ -std=c++11 $1.cpp  \
-I/home/nick/work/package/install/opencv_4.0.1/include/opencv4 \
-L/home/nick/work/package/install/opencv_4.0.1/lib/ \
-L/home/nick/work/package/install/opencv_4.0.1/lib/opencv4/3rdparty\
-L/home/nick/work/package/install/ffmpeg-4.1/lib  \
-lopencv_world \
-lIlmImf -littnotify -llibtiff -llibjasper -llibjpeg-turbo -llibpng -llibwebp -lzlib \
-lavformat -lavdevice -lavcodec -lavfilter -lavutil -lpostproc -lswresample -lswscale -lm -lz \
-lpthread -ldl  \
-o $1

測試 Background Removal

由於這ˋ個編譯的項目是用 static ( 為了可以ˊ移植到 embedded system), 而 gtk 的依賴檔案太多, 故放棄 GUI 的測試方式. 直接寫到檔案.

 

Vatics – Operation Note

24 一月, 2019

簡述

紀錄 Vatics SDK 操作事項

Streaming Link

rtsp://172.23.218.139/live1.sdp

Suspend Mode

SoC -> SYS_O_MON_CLK (B18) -> MCU

 

 

Ubuntu – Install v4l-utils

18 一月, 2019

簡述

在 Ubuntu 上安裝 v4l-utils

下載

https://www.linuxtv.org/downloads/v4l-utils/ 下載

直接安裝

$ sudo apt-get update -y

$ sudo apt-get install -y v4l-utils

Git – Export new project to Github

7 一月, 2019

簡述

負責很多專案. 大多是 IC 廠商釋出的平台及 SDK, 稍作修改, 然後發行. 維護這樣的版本, 很討厭. 廠商釋出的版本, 改了甚麼東西根本無從預期, 有時是連檔案結構都改了, 自己修改的部分, 要水平移植, 非常困擾.

目前的作法只是先放進版本控制. 雖然只有一個人在修改, 但是專案太多, 常常忘了那些是有修改過, 改過了甚麼.  還是先放進版本控制比較保險.

公司內的伺服器, 現在只有在台北辦公室可以連上. 而一星期也只有上來一天. 所以先把它放到 private github, 星期一再同步到公司的伺服器.

步驟

  1. 在 github 新增專案 (private/ no readme)github-new-project
  2. 按下建立 (Create repository)github-created-project
  3. 顯示的即為此 repo 的 URL
  4. 在要上傳的專案中, 打開 Git Bash Hereopen-git-bash
  5. 建立 gitattribute (內容如下)git-attributes
  6. $ git init
  7. $ git config core.autocrlf false git-console
  8. Add source codes git-insert
  9. git push to remote (由於是 private, 需要輸入帳號密碼)git-push
  10. 完成 git-done

 

Git – CRLF problem

7 一月, 2019

簡述

git 是一套版本控制的軟體, 非常的普及. 但是它也存在一些問題, 常常在使用上造成困擾. 尤其是 CRLF 問題. CRLF 是列終結的符號.

在早期打字機上, 換列是兩個動作. Line Feed ( 往前轉一列), Carrage Return (打字頭回車, 回到左邊的邊界), 所以在 ASCII code 上, 這也是兩個不同的字元. 在進入電子時代的時候, 不同的作業系統上, 採用了不同的表現方式.

版本控制, 主要是針對原始碼. 原始碼就是一個文字檔案, 所以會有列終結的符號字元.

git 是在 Linux 上開發的系統, 所以內部比較採用的是 Linux 的風格. 他預設把所有的列終結符號, 都轉換成 Linux 的風格.

但是現在的文書處理或是開發程式的 IDE 大多可以處理這樣的差異. 反而造成 check in 進去之後, 一比較, 就產生了差異. 如果程式只有一個人在維護修改, 也許問題不大. 不過如果程式有部分是來自其他的提供者, 或是有不同的人一起維護, 這樣就會額外花許多精神在處理這個問題. 反而是困擾.

Git Setting on CRLF

$ git config core.autocrlf false

設定 repo 的 CRLF

$ git config –global core.autocrlf false

設定整個系統 (電腦) 的 CRLF

可以 config 的類別

  • true – transforms the local line break character (configured in core.eol) to LF
  • false – disable the normalization process and leave the files as they are
  • input – apply the normalization process to newly added files, but never to files which are already commited

.gitattributes

再加入其他檔案之前, 先建立 .gitattributes, 並且 check in

# Ignore CRLF in all files
* -crlf

https://help.github.com/articles/dealing-with-line-endings/

 

 

 

Vatics – Sample Program

4 一月, 2019

簡述

列出 Vatics 的 sample program 及測試結果

Localtion

預設的程式及資料位置在 /mnt/flash/vienna

2.1 streamer

$ streamer -C stream.ini -D

* TBD

2.1.1 streamer_msg_sender

* TBD

2.2 tinyaenc_mmap

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/flash/vienna/lib

# ./tinyaenc_mmap
/mnt/flash/vienna/tinyaenc_mmap: can’t load library ‘libatk_audio_utils_mmap.so.1’

# echo $LD_LIBRARY_PATH
:/mnt/flash/vienna/lib
# ls /mnt/flash/vienna/lib/libatk_audio_utils_mmap.so*
/mnt/flash/vienna/lib/libatk_audio_utils_mmap.so
/mnt/flash/vienna/lib/libatk_audio_utils_mmap.so.1
/mnt/flash/vienna/lib/libatk_audio_utils_mmap.so.1.0.0.0

2.2.1 aenc_msg_sender

2.3 rtsps

2.4 rtmp_publisher

2.5 venc1

# ./venc1
/mnt/flash/vienna/venc1: can’t load library ‘libvmf.so.3’

2.6 venc2

# ./venc2
/mnt/flash/vienna/venc2: can’t load library ‘libvmf.so.3’

2.6.1 venc2_msg_sender

2.7 venc3

2.7.1 venc3_msg_sender

2.8 venc4

2.8.1 venc4_msg_sender

2.9 venc5

2.9.1 venc5_msg_sender

2.10 srb_receiver

2.11 video_yuv

2.12 snapshot

2.12.1 snapshot_msg_sender

2.13 fusion

2.13.1 fusion_msg_sender

2.14 dma_test

2.15 vrec

2.16 playback_example_mmap

2.17 playback_file_mmap

2.18 volume_ctrl

 

Ubuntu 18.04 – disable services

4 一月, 2019

簡述

Ubuntu 18.04 多了一些 service, 非常困擾. 可能也是我不會用, 不過就是很討厭

Disable NetworkManager

sudo systemctl stop NetworkManager-wait-online.service
sudo systemctl disable NetworkManager-wait-online.service

sudo systemctl stop NetworkManager-dispatcher.service
sudo systemctl disable NetworkManager-dispatcher.service

sudo systemctl stop network-manager.service
sudo systemctl disable network-manager.service

Disable systemd-networkd-wait-online

systemctl disable systemd-networkd-wait-online.service

systemctl mask systemd-networkd-wait-online.service

List services

service –status-all

STM32 – 基本規格

4 一月, 2019

簡述

STM32 是 ARM based 的一系列處理器, 因為太常用, 規格比較繁複, 這裡整理現在用到的 STM32L011F4P6 的規格

編號

編號本身就是規格.

STM32=Arm-based 32-bit microcontroller

L=Low power

011=Access line

Pin Count

  • K = 32 pins
  • G = 28 pins
  • E = 25 pins
  • F = 20 pins
  • D = 14 pins

Flash memory size

  • 3= 8 K bytes
  • 4=16K bytes

Package

  • T = LQFP
  • U = UFQFPN
  • Y = WLCSP
  • P = TSSOP

Temperature range

  • 6 = Industrial temperature range -40 to 85
  • 7 = Industrial temperature range -40 to 105
  • 3 = Industrial temperature range -40 to 125

STM32L011F4P6

STM32L011F4P6, 根據以上的敘述, 它的基本規格是: 32 bit ARM processor, low power, 20 pins, 16 K Flash memory, TSSOP 包裝, 工作溫度 -40 ~ 85. Pin out 如下stm32l011f4p6-pinout

 

 

 

Vatics – Cross compile OpenSSL

2 一月, 2019

簡述

編譯 OpenSSL 的 Vatics 版本

下載

$ wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz

$ tar -xvzf openssl-1.0.2o.tar.gz

編譯

$ ./Configure linux-generic32 no-asm \
–prefix=/home/nick/vatics/package/install/openssl  \
–openssldir=/home/nick/vatics/package/openssl-1.0.2o

$ make CC=arm-linux-gcc

$ make install_sw

修改 Makefile

CROSS_COMPILE= arm-linux-
CC= $(CROSS_COMPILE)gcc

CFLAG=
-fPIC
-DOPENSSL_PIC
-DOPENSSL_THREADS
-D_REENTRANT
-DDSO_DLFCN
-DHAVE_DLFCN_H
-mabi=32
-O3
-Wall
-DBN_DIV3W

DEPFLAG=
-DOPENSSL_NO_EC_NISTP_64_GCC_128
-DOPENSSL_NO_GMP
-DOPENSSL_NO_JPAKE
-DOPENSSL_NO_LIBUNBOUND
-DOPENSSL_NO_MD2
-DOPENSSL_NO_RC5
-DOPENSSL_NO_RFC3779
-DOPENSSL_NO_SCTP
-DOPENSSL_NO_SSL_TRACE
-DOPENSSL_NO_SSL2
-DOPENSSL_NO_STORE
-DOPENSSL_NO_UNIT_TEST
-DOPENSSL_NO_WEAK_SSL_CIPHERS

EX_LIBS= -ldl