arm Linux平台下FFmpeg的移植

本文详细介绍了如何在armLinux平台,特别是hi3516dv300开发板上,移植和编译FFmpeg、libx264、fdk_aac等组件,用于视频直播项目的推流功能。过程中涉及交叉编译、配置选项以及错误处理,最后通过FFmpeg进行不同类型的视频流处理和测试。
摘要由CSDN通过智能技术生成

一个视频直播的项目,需要使用嵌入式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:结束时间

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg是一个开源的跨平台视频处理库,可以用来处理音频和视频的编码、解码、转码以及流媒体的处理等。移植FFmpegARM架构上,可以使其在具有ARM处理器的设备上运行,例如智能手机、平板电脑和嵌入式系统等。 在移植FFmpegARM上,首先需要进行代码的适配,将代码针对ARM架构进行编译和优化。ARM架构与x86架构有一些差异,所以需要进行一些相关的修改和调整,以确保FFmpeg代码可以在ARM上正常运行。 其次,需要根据ARM平台的特性和资源限制进行配置。ARM架构通常会有不同的版本和各自的特性,因此需要根据具体的ARM平台进行相应的配置,以提供最佳的性能和兼容性。 另外,还需要解决ARM平台上可能存在的一些兼容性问题。由于ARM平台的生态系统和软件环境与x86平台存在差异,在移植过程中可能会遇到一些与硬件、操作系统或其他软件的兼容性问题。需要及时解决这些问题,以确保FFmpegARM上的正常运行。 最后,还可以根据ARM平台的特性,对FFmpeg进行优化和定制,以进一步提升性能。例如,可以针对ARM的 SIMD(Single Instruction, Multiple Data)指令集进行优化,充分利用ARM处理器的并行计算能力。此外,还可以针对ARM平台使用的特定格式或编解码算法进行优化,以提升对这些格式或算法的处理速度和效率。 总之,移植FFmpegARM上是为了在ARM设备上实现音视频处理的功能。这需要进行代码的适配和优化,配置ARM平台的相关参数,并解决可能出现的兼容性问题,以提供高性能和稳定性的音视频处理能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值