背景
Ffmpeg 中帶有h264的解碼,沒有編碼,需要添加x264。libx264是一個自由的H.264編碼庫,是x264項目的一部分,使用廣泛,ffmpeg的H.264實現就是用的libx264。
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。
librtmp用來接收、發布RTMP協議格式的數據。FFmpeg支持RTMP協議,將librtmp編譯進去后支持協議RTMPE、RMTPTE、RTMPS。這里我直接使用FFmpeg自帶的RTMP功能。
host平台 :Ubuntu 18.04
arm平台 : S5P6818
arm-gcc :4.8.1
編譯
使用以下腳本一鍵編譯。
##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
# File Name: make.sh
# Created : Mon 02 Sep 2019 08:05:53 PM HKT
##
#!/bin/sh
BASE=`pwd`
BUILD_HOST=arm-linux
OUTPUT_PATH=${BASE}/install
OTHER_LIB=${OUTPUT_PATH}/__all_without_ffmpeg
make_dirs () {
#為了方便管理,創建有關的目錄
cd ${BASE} && mkdir compressed install source -p
}
tget () { #try wget
filename=`basename $1`
echo "Downloading [${filename}]..."
if [ ! -f ${filename} ];then
wget $1
fi
echo "[OK] Downloaded [${filename}] "
}
download_package () {
cd ${BASE}/compressed
tget http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20171212-2245.tar.bz2
tget http://ffmpeg.org/releases/ffmpeg-4.0.1.tar.bz2
tget http://download.videolan.org/videolan/x265/x265_2.6.tar.gz
}
tar_package () {
cd ${BASE}/compressed
ls * > /tmp/list.txt
for TAR in `cat /tmp/list.txt`
do
tar -xf $TAR -C ../source
done
rm -rf /tmp/list.txt
}
make_x264() {
cd ${BASE}/source/x264*
CC=${BUILD_HOST}-gcc \
./configure \
--host=${BUILD_HOST} \
--enable-shared \
--enable-static \
--enable-pic \
--prefix=${OUTPUT_PATH}/x264 \
--cross-prefix=${BUILD_HOST}- \
--disable-asm
make -j4 && make install
}
make_x265() {
#sudo apt-get install cmake -y
# 其他編譯選項可以 通過 在 cmake ../source 以后 ccmake ../source 可以查看 ( ccmake 可以通過 sudo apt-get install cmake-curses-gui 進行安裝 )
cd ${BASE}/source/x265*/source
# 獲取 工具鏈所在位置 下面的操作為的是在 CMakeLists.txt 中插入下面內容
GCC_FULL_PATH=`whereis ${BUILD_HOST}-gcc | awk -F: '{ print $2 }' | awk '{print $1}'` # 防止多個結果
GCC_DIR=`dirname ${GCC_FULL_PATH}/`
sed -i "1i\set( CMAKE_SYSTEM_NAME Linux )" CMakeLists.txt
sed -i "2a\set( CMAKE_SYSTEM_PROCESSOR ARM )" CMakeLists.txt
sed -i "2a\set( CMAKE_C_COMPILER ${GCC_DIR}/${BUILD_HOST}-gcc )" CMakeLists.txt
sed -i "2a\set( CMAKE_CXX_COMPILER ${GCC_DIR}/${BUILD_HOST}-g++ )" CMakeLists.txt
sed -i "2a\set( CMAKE_FIND_ROOT_PATH ${GCC_DIR} )" CMakeLists.txt
cmake ../source
# 指定安裝路徑
sed -i "1i\set( CMAKE_INSTALL_PREFIX "${BASE}/install/x265" )" cmake_install.cmake
make && make install
}
prepare_other_lib () {
# 這一個是針對 ffmpeg 方便管理外部庫使用的
# 核心思想是把 所有的庫都放到一起,再讓 ffmpeg ld的時候在這里找(而不是添加多行) --extra-cflags="-I${X264_DIR}/include -I${xxx}/include" \
cd ${BASE}/install/
rm ${OTHER_LIB} -rf
ls > /tmp/list.txt
mkdir ${OTHER_LIB} -p
for sub_dir in `cat /tmp/list.txt`
do
cp ${sub_dir}/* ${OTHER_LIB} -r -v
done
rm -rf /tmp/list.txt
}
make_ffmpeg() {
MYPKGCONFIG=${BASE}/install/x265/lib/pkgconfig/
export PKG_CONFIG_PATH=${MYPKGCONFIG}:$PKG_CONFIG_PATH
cd ${BASE}/source/ffmpeg*
./configure \
--cross-prefix=${BUILD_HOST}- \
--enable-cross-compile \
--target-os=linux \
--cc=${BUILD_HOST}-gcc \
--arch=arm \
--prefix=${OUTPUT_PATH}/ffmpeg \
--enable-shared \
--enable-static \
--enable-gpl \
--enable-nonfree \
--enable-ffmpeg \
--disable-ffplay \
--enable-swscale \
--pkg-config="pkg-config --static" \
--enable-pthreads \
--disable-armv5te \
--disable-armv6 \
--disable-armv6t2 \
--disable-yasm \
--disable-stripping \
--enable-libx264 \
--enable-libx265 \
--extra-cflags=-I${OTHER_LIB}/include \
--extra-ldflags=-L${OTHER_LIB}/lib &&
make clean && make -j4 && make install
}
echo "Using ${BUILD_HOST}-gcc"
make_dirs
download_package
tar_package
make_x264
make_x265
prepare_other_lib
make_ffmpeg
配置完成以后可能會有這個警告,但是不影響后續的結果
License: nonfree and unredistributable
Creating configuration files ...
WARNING: The --disable-yasm option is only provided for compatibility and will be
removed in the future. Use --enable-x86asm / --disable-x86asm instead.
WARNING: unknown architecture linux
WARNING: using libx264 without pkg-config
開發板准備
生成完的結果都在 install
目錄中。
拷貝 __all_without_ffmpeg
中的 lib
下的所有文件到板子上的/usr/lib 中,同樣地,拷貝ffmpeg中的lib到板子上。
拷貝 install/ffmpeg
中的 ffmpeg 文件到板子上。
測試
ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/tmp/test.avi
# video4linux2 代表Linux下
# /dev/video0 代表攝像頭設備
# /mnt/tmp/test.avi代表輸出路徑