arm Linux平台下FFmpeg的移植
一个视频直播的项目,需要使用嵌入式Linux设备作为一个推流端,所以使用FFmpeg实现推流功能。
libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264。ffmpeg 中带有264的解码,没有编码,需要添加x264。
fdk_aac被许多人认为几乎是最好的aac编码器,音质顺序大概为libfdk_aac>libfaac>aac>libvo_aacenc。
librtmp用来接收、发布RTMP协议格式的数据。FFmpeg支持RTMP协议,将librtmp编译进去后支持协议RTMPE、RMTPTE、RTMPS。这里我直接使用FFmpeg自带的RTMP功能。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
1.安装环境
a.上位机:ubuntu16.04.1
b.开发板:hi3516dv300
2.准备
(1)libx264
下载地址:http://www.videolan.org/developers/x264.html 。我所使用版本为x264-snapshot-20171109-2245。(太新的版本可能会导致和 ubuntu16.04.1的兼容问题)
(2)fdk_aac
使用下面的命令进行下载:
$ wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
(3)FFmpeg
下载地址:http://ffmpeg.org 。我所使用版本为ffmpeg-3.4。(太新的版本可能会导致和 ubuntu16.04.1的兼容问题)
(4)vlc 播放器
下载地址:https://get.videolan.org/vlc/3.0.18/win64/vlc-3.0.18-win64.exe
3.编译安装
(1)x264配置编译安装
配置(先自行创建linux_x264文件夹)
./configure --prefix=/home/linux_x264 --enable-shared --host=arm-himix200-linux --cross-prefix=arm-himix200-linux- --disable-asm
–host:运行环境 (交叉编译成arm)
–prefix: 指定安装目录,其中$PWD指的是当前路径。
–enable-shared:生成动态链接库
–cross-prefix:交叉工具链地址
-–disable-asm:禁用 asm,跳过汇编
查看配置文件config.mak
vi config.mak
SRCPATH=.
prefix=/home/linux/workspace/platform/Hi3516/tools/x264
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
SYS_ARCH=ARM
SYS=LINUX
CC=arm-himix200-linux-gcc
CFLAGS=-Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -D_GNU_SOURCE -fPIC -fomit-frame-pointer -fno-tree-vectorize
COMPILER=GNU
COMPILER_STYLE=GNU
DEPMM=-MM -g0
DEPMT=-MT
LD=arm-himix200-linux-gcc -o
LDFLAGS= -lm -lpthread -ldl
LIBX264=libx264.a
AR=arm-himix200-linux-gcc-ar rc
RANLIB=arm-himix200-linux-gcc-ranlib
STRIP=arm-himix200-linux-strip
INSTALL=install
AS=
ASFLAGS= -I. -I$(SRCPATH) -DSTACK_ALIGNMENT=4 -DPIC
RC=
RCFLAGS=
EXE=
HAVE_GETOPT_LONG=1
DEVNULL=/dev/null
PROF_GEN_CC=-fprofile-generate
PROF_GEN_LD=-fprofile-generate
PROF_USE_CC=-fprofile-use
PROF_USE_LD=-fprofile-use
HAVE_OPENCL=yes
CC_O=-o $@
default: cli
install: install-cli
SOSUFFIX=so
SONAME=libx264.so.155
SOFLAGS=-shared -Wl,-soname,$(SONAME) -Wl,-Bsymbolic
default: lib-shared
install: install-lib-shared
LDFLAGSCLI = -ldl
CLI_LIBX264 = $(LIBX264)
编译
make
编译过程中报错:
libx264.a(set.o):在函数‘x264_sps_init’中:
set.c:(.text+0xa10):对‘log2f’未定义的引用
libx264.a(encoder.o):在函数‘x264_validate_parameters’中:
encoder.c:(.text+0x2990):对‘log2f’未定义的引用
修改common/osdep.h文件,删除log2和log2f函数定义的条件判断部分,再次进行编译后,编译通过。
//#if !HAVE_LOG2F
#define log2f(x) (logf(x)/0.693147180559945f)
#define log2(x) (log(x)/0.693147180559945)
//#endif
安装
make install
(2)FFMPEG配置编译安装(先自行创建linux_x264文件夹)
配置
./configure --cross-prefix=arm-himix200-linux- --enable-cross-compile --target-os=linux
--cc=arm-himix200-linux-gcc --arch=arm --prefix=/home/ffmpeg --enable-shared
--disable-static --enable-gpl --enable-nonfree --disable-ffplay --enable-swscale --enable-pthreads
--disable-armv5te --disable-armv6 --disable-armv6t2 --disable-x86asm --disable-stripping --enable-libx264
--extra-cflags=-I/home/linux_x264/include
--extra-ldflags=-L/home/linux_x264/lib --extra-libs=-ldl
4.移植
1.将安装目录/home/linux_x264下的lib/下所需要文件拷贝到开发板根目录下的对应位置/lib/。
2.将安装目录/home/ffmpeg 下的lib/文件全部拷贝到开发板的/lib/目录
3.将安装目录/home/ffmpeg 下的bin/目录下的 ffmpeg 拷贝到开发板的/bin/
5.测试
将开发板上的mp4推流到远程nginx的rtmp
ffmpeg -re -i qirenyuedui.mp4 -vcodec h264 -f flv rtmp://192.168.1.186:8112/live/1
将开发板上的usb摄像头的视频保存成本地avi的文件
ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/nfs/test.avi
将开发板上的usb摄像头的视频推流到远程nginx的rtmp
ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 -vcodec copy -acodec copy -f flv rtmp://192.168.1.186:8112/live/1
将海康威视(远程IPC)的视频流(rtsp)拉流到开发板
ffmpeg -stimeout 30000000 -i rtsp://admin:zhw520615@192.168.1.220:554/stream -c copy output.mp4
将海康威视(远程IPC)的视频流(rtsp)推流到远程nginx的rmtp(开发板做中转)
ffmpeg -re -rtsp_transport tcp -i rtsp://admin:zhw520615@192.168.1.220:554/h264/ch1/main/av_stream -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://192.168.1.186:8112/live/test
番外
海康 & 大华 & DSS 获取 RTSP
实时流
海康:
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。
例子:
IPC
rtsp://admin:123456@192.168.18.105:554/h264/ch1/main/av_stream
NVR
rtsp://admin:123456@192.168.18.106:554/Streaming/Channels/101
说明:
101,第一个 1 代表通道,最后一个 1 代表码流。
大华:
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)。
例子:
rtsp://admin:admin@192.168.18.107:554/cam/realmonitor?channel=2&subtype=1
回放流
海康:
rtsp://[username]:[password]@[ip]:[port]/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z
说明:
101:1,表示通道 1;01,表示以单播形式回放指定设备的通道中的录像文件
starttime:开始时间
endtime:结束时间
时间范围是 starttime 到 endtime,其中 starttime 和 endtime 的格式要符合 ISO 8601。
具体格式是 YYYYMMDD”T”HHmmSS.fraction”Z” ,Y 是年,M 是月,D 是日,T 是时间分格符,H 是小时,M 是分,S 是秒,Z 是可选的、表示 Zulu (GMT) 时间。
大华:
rtsp://[username]:[password]@[ip]:[port]/cam/playback?channel=1&subtype=0&starttime=2017_01_10_01_00_00&endtime=2017_01_10_02_00_00
说明:
username: 用户名。例如 admin。
password: 密码。例如 admin。
ip: 为设备 IP。
port: 端口号默认为 554,若为默认可不填写。
channel: 通道号,起始为 1。例如通道 2,则为 channel=2。
subtype: 码流类型,主码流为 0(即 subtype=0),辅码流为 1(即 subtype=1)。
starttime:开始时间
endtime:结束时间