ARMFPGA开发板基于FFMPEG的网络视频播放终端

01.前言  

米尔这款ARM+fpga开发板具备高性能的ARM MPU+多媒体能力,采用i.MX 8M Mini+Artix-7处理器,特别适合多媒体终端开发。本篇就体验搭建ffmpeg开发环境,并进行性能测试,进行视频播放,演示网络视频播放器等。

02.编译过程

交叉编译

下载代码

git clone https://github.com/FFmpeg/FFmpeg.git

cd FFmpeg/

交叉编译

./configure --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=aarch64-linux-gnu-gcc --arch=arm64 --prefix=/home/lhj/opt/ffmpeg/board --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2

WARNING: aarch64-linux-gnu-pkg-config not found, library detection may fail.

make

make install

生成文件如下

lhj@lhj:~/FFmpeg$ tree /home/lhj/opt/ffmpeg/board/

/home/lhj/opt/ffmpeg/board/

-- bin

-- ffmpeg

`-- ffprobe

-- include

-- libavcodec

   -- ac3_parser.h

   -- adts_parser.h

   -- avcodec.h

   -- avdct.h

   -- avfft.h

   -- bsf.h

   -- codec.h

   -- codec_desc.h

   -- codec_id.h

   -- codec_par.h

   -- d3d11va.h

   -- defs.h

   -- dirac.h

   -- dv_profile.h

   -- dxva2.h

   -- jni.h

   -- mediacodec.h

   -- packet.h

   -- qsv.h

   -- vdpau.h

   -- version.h

   -- version_major.h

   -- videotoolbox.h

   -- vorbis_parser.h

   `-- xvmc.h

-- libavdevice

   -- avdevice.h

   -- version.h

   `-- version_major.h

-- libavfilter

   -- avfilter.h

   -- buffersink.h

   -- buffersrc.h

   -- version.h

   `-- version_major.h

-- libavformat

   -- avformat.h

   -- avio.h

   -- version.h

   `-- version_major.h

-- libavutil

   -- adler32.h

   -- aes.h

   -- aes_ctr.h

   -- ambient_viewing_environment.h

   -- attributes.h

   -- audio_fifo.h

   -- avassert.h

   -- avconfig.h

   -- avstring.h

   -- avutil.h

   -- base64.h

   -- blowfish.h

   -- bprint.h

   -- bswap.h

   -- buffer.h

   -- camellia.h

   -- cast5.h

   -- channel_layout.h

   -- common.h

   -- cpu.h

   -- crc.h

   -- csp.h

   -- des.h

   -- detection_bbox.h

   -- dict.h

   -- display.h

   -- dovi_meta.h

   -- downmix_info.h

   -- encryption_info.h

   -- error.h

   -- eval.h

   -- ffversion.h

   -- fifo.h

   -- file.h

   -- film_grain_params.h

   -- frame.h

   -- hash.h

   -- hdr_dynamic_metadata.h

   -- hdr_dynamic_vivid_metadata.h

   -- hmac.h

   -- hwcontext.h

   -- hwcontext_cuda.h

   -- hwcontext_d3d11va.h

   -- hwcontext_drm.h

   -- hwcontext_dxva2.h

   -- hwcontext_mediacodec.h

   -- hwcontext_opencl.h

   -- hwcontext_qsv.h

   -- hwcontext_vaapi.h

   -- hwcontext_vdpau.h

   -- hwcontext_videotoolbox.h

   -- hwcontext_vulkan.h

   -- imgutils.h

   -- intfloat.h

   -- intreadwrite.h

   -- lfg.h

   -- log.h

   -- lzo.h

   -- macros.h

   -- mastering_display_metadata.h

   -- mathematics.h

   -- md5.h

   -- mem.h

   -- motion_vector.h

   -- murmur3.h

   -- opt.h

   -- parseutils.h

   -- pixdesc.h

   -- pixelutils.h

   -- pixfmt.h

   -- random_seed.h

   -- rational.h

   -- rc4.h

   -- replaygain.h

   -- ripemd.h

   -- samplefmt.h

   -- sha.h

   -- sha512.h

   -- spherical.h

   -- stereo3d.h

   -- tea.h

   -- threadmessage.h

   -- time.h

   -- timecode.h

   -- timestamp.h

   -- tree.h

   -- twofish.h

   -- tx.h

   -- uuid.h

   -- version.h

   -- video_enc_params.h

   `-- xtea.h

-- libswresample

   -- swresample.h

   -- version.h

   `-- version_major.h

`-- libswscale

-- swscale.h

-- version.h

`-- version_major.h

-- lib

-- libavcodec.a

-- libavdevice.a

-- libavfilter.a

-- libavformat.a

-- libavutil.a

-- libswresample.a

-- libswscale.a

`-- pkgconfig

-- libavcodec.pc

-- libavdevice.pc

-- libavfilter.pc

-- libavformat.pc

-- libavutil.pc

-- libswresample.pc

`-- libswscale.pc

`-- share

-- doc

`-- ffmpeg

-- bootstrap.min.css

-- default.css

-- developer.html

-- faq.html

-- fate.html

-- ffmpeg-all.html

-- ffmpeg-bitstream-filters.html

-- ffmpeg-codecs.html

-- ffmpeg-devices.html

-- ffmpeg-filters.html

-- ffmpeg-formats.html

-- ffmpeg-protocols.html

-- ffmpeg-resampler.html

-- ffmpeg-scaler.html

-- ffmpeg-utils.html

-- ffmpeg.html

-- ffprobe-all.html

-- ffprobe.html

-- general.html

-- git-howto.html

-- libavcodec.html

-- libavdevice.html

-- libavfilter.html

-- libavformat.html

-- libavutil.html

-- libswresample.html

-- libswscale.html

-- mailing-list-faq.html

-- nut.html

-- platform.html

`-- style.min.css

-- ffmpeg

-- examples

   -- Makefile

   -- README

   -- avio_list_dir.c

   -- avio_reading.c

   -- decode_audio.c

   -- decode_video.c

   -- demuxing_decoding.c

   -- encode_audio.c

   -- encode_video.c

   -- extract_mvs.c

   -- filter_audio.c

   -- filtering_audio.c

   -- filtering_video.c

   -- http_multiclient.c

   -- hw_decode.c

   -- metadata.c

   -- muxing.c

   -- qsv_transcode.c

   -- qsvdec.c

   -- remuxing.c

   -- resampling_audio.c

   -- scaling_video.c

   -- transcode_aac.c

   -- transcoding.c

   -- vaapi_encode.c

   `-- vaapi_transcode.c

-- ffprobe.xsd

-- libvpx-1080p.ffpreset

-- libvpx-1080p50_60.ffpreset

-- libvpx-360p.ffpreset

-- libvpx-720p.ffpreset

`-- libvpx-720p50_60.ffpreset

`-- man

-- man1

-- ffmpeg-all.1

-- ffmpeg-bitstream-filters.1

-- ffmpeg-codecs.1

-- ffmpeg-devices.1

-- ffmpeg-filters.1

-- ffmpeg-formats.1

-- ffmpeg-protocols.1

-- ffmpeg-resampler.1

-- ffmpeg-scaler.1

-- ffmpeg-utils.1

-- ffmpeg.1

-- ffprobe-all.1

`-- ffprobe.1

`-- man3

-- libavcodec.3

-- libavdevice.3

-- libavfilter.3

-- libavformat.3

-- libavutil.3

-- libswresample.3

`-- libswscale.3

19 directories, 234 files

lhj@lhj:~/FFmpeg$

开发板上部署

将bin文件复制到windows下

cp /home/lhj/opt/ffmpeg/board/bin/* /mnt/d

将lib文件复制到windows下

cp /home/lhj/opt/ffmpeg/board/lib/* /mnt/d

再将上述lib文件*.a导入到开发板的/usr/lib目录下

将ffmpeg和ffprobe导入到~目录下

测试

chmod +x ffmpeg ffprobe

root@myd-jx8mma7:~# ./ffmpeg

ffmpeg version N-109734-g806ecace91 Copyright (c) 2000-2023 the FFmpeg developers

built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

configuration: --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=aarch64-linux-gnu-gcc --arch=arm64 --prefix=/home/lhj/opt/ffmpeg/board --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2

libavutil 57. 44.100 / 57. 44.100

libavcodec 59. 60.100 / 59. 60.100

libavformat 59. 37.100 / 59. 37.100

libavdevice 59. 8.101 / 59. 8.101

libavfilter 8. 56.100 / 8. 56.100

libswscale 6. 8.112 / 6. 8.112

libswresample 4. 9.100 / 4. 9.100

Hyper fast Audio and Video encoder

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

root@myd-jx8mma7:~#

root@myd-jx8mma7:~# ./ffprobe

ffprobe version N-109734-g806ecace91 Copyright (c) 2007-2023 the FFmpeg developers

built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

configuration: --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=aarch64-linux-gnu-gcc --arch=arm64 --prefix=/home/lhj/opt/ffmpeg/board --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2

libavutil 57. 44.100 / 57. 44.100

libavcodec 59. 60.100 / 59. 60.100

libavformat 59. 37.100 / 59. 37.100

libavdevice 59. 8.101 / 59. 8.101

libavfilter 8. 56.100 / 8. 56.100

libswscale 6. 8.112 / 6. 8.112

libswresample 4. 9.100 / 4. 9.100

Simple multimedia streams analyzer

usage: ffprobe [OPTIONS] INPUT_FILE

You have to specify one input file.

Use -h to get full help or, even better, run 'man ffprobe'.

root@myd-jx8mma7:~#

性能测试

https://www.sample-videos.com/index.php#sample-mp4-video下下载测试视频改名为test.mp4

导入到开发板。

./ffmpeg -benchmark -i test.mp4 -f null -

打印如下

root@myd-jx8mma7:~# ffmpeg -benchmark -i test.mp4 -f null -

-sh: ffmpeg: command not found

root@myd-jx8mma7:~# ./ffmpeg -benchmark -i test.mp4 -f null -

ffmpeg version N-109734-g806ecace91 Copyright (c) 2000-2023 the FFmpeg developers

built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

configuration: --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=aarch64-linux-gnu-gcc --arch=arm64 --prefix=/home/lhj/opt/ffmpeg/board --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2

libavutil 57. 44.100 / 57. 44.100

libavcodec 59. 60.100 / 59. 60.100

libavformat 59. 37.100 / 59. 37.100

libavdevice 59. 8.101 / 59. 8.101

libavfilter 8. 56.100 / 8. 56.100

libswscale 6. 8.112 / 6. 8.112

libswresample 4. 9.100 / 4. 9.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

creation_time : 1970-01-01T00:00:00.000000Z

encoder : Lavf53.24.2

Duration: 00:02:50.86, start: 0.000000, bitrate: 1474 kb/s

Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1086 kb/s, 25 fps, 25 tbr, 12800 tbn (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : VideoHandler

vendor_id : [0][0][0][0]

Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : SoundHandler

vendor_id : [0][0][0][0]

Stream mapping:

Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))

Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))

Press [q] to stop, [?] for help

Output #0, null, to 'pipe:':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

encoder : Lavf59.37.100

Stream #0:0(und): Video: wrapped_avframe, yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : VideoHandler

vendor_id : [0][0][0][0]

encoder : Lavc59.60.100 wrapped_avframe

Stream #0:1(und): Audio: pcm_s16le, 48000 Hz, 5.1, s16, 4608 kb/s (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : SoundHandler

vendor_id : [0][0][0][0]

encoder : Lavc59.60.100 pcm_s16le

frame= 4271 fps=222 q=-0.0 Lsize=N/A time=00:02:50.83 bitrate=N/A speed=8.87x   

video:2002kB audio:96108kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

bench: utime=67.061s stime=2.796s rtime=19.272s

bench: maxrss=40720kB

root@myd-jx8mma7:~#

对比在PC上的测试结果

bench: utime=8.169s

bench: maxrss=107384kB

开板上大概是PC上2.5分之一的效率。这相对对于2th Gen Intel(R) Core(TM) i5-12500H 2.50 GHz处理器切实固态硬盘的电脑来说,嵌入式开发板的性能已经算不错了,单纯针对这一点几乎可以媲美PC使用了。

03.网络视频点播终端

./ffmpeg -re -i test.mp4 -an -vcodec copy -f rtp rtp://192.168.2.100:5004

打印如下

root@myd-jx8mma7:~# ./ffmpeg -re -i test.mp4 -an -vcodec copy -f rtp rtp://192.168.2.100:5004

ffmpeg version N-109734-g806ecace91 Copyright (c) 2000-2023 the FFmpeg developers

built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

configuration: --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --target-os=linux --cc=aarch64-linux-gnu-gcc --arch=arm64 --prefix=/home/lhj/opt/ffmpeg/board --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2

libavutil 57. 44.100 / 57. 44.100

libavcodec 59. 60.100 / 59. 60.100

libavformat 59. 37.100 / 59. 37.100

libavdevice 59. 8.101 / 59. 8.101

libavfilter 8. 56.100 / 8. 56.100

libswscale 6. 8.112 / 6. 8.112

libswresample 4. 9.100 / 4. 9.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

creation_time : 1970-01-01T00:00:00.000000Z

encoder : Lavf53.24.2

Duration: 00:02:50.86, start: 0.000000, bitrate: 1474 kb/s

Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1086 kb/s, 25 fps, 25 tbr, 12800 tbn (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : VideoHandler

vendor_id : [0][0][0][0]

Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : SoundHandler

vendor_id : [0][0][0][0]

Output #0, rtp, to 'rtp://192.168.2.100:5004':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

encoder : Lavf59.37.100

Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1086 kb/s, 25 fps, 25 tbr, 90k tbn (default)

Metadata:

creation_time : 1970-01-01T00:00:00.000000Z

handler_name : VideoHandler

vendor_id : [0][0][0][0]

SDP:

v=0

o=- 0 0 IN IP4 127.0.0.1

s=No Name

c=IN IP4 192.168.2.100

t=0 0

a=tool:libavformat 59.37.100

m=video 5004 RTP/AVP 96

b=AS:1086

a=rtpmap:96 H264/90000

a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z01AH9oBQBbsBEAAAAMAQAAADIPGDKg=,aO88gA==; profile-level-id=4D401F

Stream mapping:

Stream #0:0 -> #0:0 (copy)

Press [q] to stop, [?] for help

frame= 683 fps= 25 q=-1.0 size= 3102kB time=00:00:27.28 bitrate= 931.5kbits/s speed= 1x

复制如下部分:

在PC端新建demo.sdp文件,粘体上述内容,然后使用VLC打开该sdp文件(VLC的安装网上搜索即可)。

可以看到视频开始播放:

04.总结

本文进行了ARM+fpga开发板的ffmpeg开发环境的搭建,并在ARM+fpga开发板上测试了ffmpeg的解码性能,以及实现了网络视频播放的Demo。综上可以看出米尔这块ARM+fpga开发板开发板的多媒体性能是非常不错的,完全满足多媒体终端的应用场景。

标签: 智能输送方案

猜你喜欢