欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NXP i.MX6 ARM-Linux多媒体音视频使用

程序员文章站 2022-04-28 07:56:00
...

项目场景:

随着ARM 平台性能的日益强大和嵌入式设备的发展,对于多媒体处理器如音视频播放、摄像头、流媒体处理等需求也日益增多,在眺望电子TW-IMX6DL-EVM开发板上实现如下多媒体功能:

  • [email protected] MPEG-4/H264/H263/MJPEG 视频编解码。
  • 隔行扫描视频转为逐行视频。
  • 网络摄像头采集。
  • 视频图像的色彩转换、缩放、旋转。
  • 屏幕显示;多屏同显,多屏异显,一屏多显。
  • mp3 格式音频编解码。
  • 音视频合成;实时进行音频和视频的录制且合成为avi 文件。
  • 音视频分离。将avi 文件分离为音频和视频文件。
  • udp 和rtsp 流媒体。

编译环境及开发包:
主机:ubuntu18.04
交叉编译器:arm-linux-gnueabihf-gcc
QT5.12.8:qt-everywhere-opensource-src-5.12.8
开发板:TW-IMX6DL-EVM
Linux:Linux-4.1.15
串口工具:Xshell

注意:本文章的所有命令涉及到的路径均为眺望电子官方环境路径,需根据自身实际环境改变。本文所演示的平台来自于眺望电子 iMX6 ARM嵌入式平台,这是一个基于NXP iMX6 ARM处理器,支持单核/双核Cortex-A9的核心板。


视频解决方案:

1.编码

使用gst-launch-1.0 命令进行视频编码的格式为:

# gst-launch-1.0 imxv4l2src device=$DEVICE num-buffers=300 ! $INPUT_CAPS ! queue ! vpuenc ! $capsfilter ! $ $MUXER ! filesink location=output.$EXTENSION
  • $DEVICE 为设备节点的名称;
  • $INPUT_CAPS为摄像头采集的格式,需要根据摄像头的支持的分辨率和帧率设置,'video/xraw,format(string)NV12,width=1920,height=1080,framerate(fraction)30/1'
    可以编码为MPEG4, H263, H264, or MJPEG 格式;
  • $capsfilter:设置输出的格式。默认输出为H264 格式文件;
- 若是设置输出格式为MPEG4,则$capsfilter设置为video/mpeg,mpegversion=(int)4,systemstream=(boolean)false; 
- 若是设置输出格式为H263,则$capsfilter 设置为video/x-h263。;
- 若是设置输出格式为MJPG,则$capsfilter 设置为image/jpeg;
  • $MUXER 合成器可选项为qtmux、 matroskamux、 mp4mux、 avimux、flvmux;
    不同的合成器,支持不同的编码类型. 使用gst-inspect-1.0 $MUXER查看详细信息。 5
  • $EXTENSION为文件格式类型。根据muxer 类型设置。

1.1编码为jpeg

jpeg 是一种图像格式,通常用于一帧帧捕获。下面是一个示例的用法:
  捕获一帧并将其保存到jpg 文件:

# gst-launch-1.0 imxv4l2src device=/dev/video2 num-buffers=1 ! jpegenc ! filesink location=file.jpg

捕获100 帧,将其编码为mjpeg,并保存到文件中:

[email protected]:/# gst-launch-1.0 imxv4l2src device=/dev/video2 num-buffers=1 ! jpegenc ! filesink location=file.jpg

/dev/video2为摄像头设备,file.jpg为生成的图片

2.解码

使用gst-launch-1.0 命令进行视频解码的格式为:

$ gst-launch-1.0 filesrc location=test.video typefind=true ! $capsfilter ! $demuxer_plugin ! queue max-size-time=0 ! $video_decoder_plugin ! $video_sink_plugin
  • filesrc:文件源,输入源为filesrc 插件;
  • $capsfilter:视频源的格式。使用gst-inspect-1.0 typefindfunctions名称可查看各视频源格式;
  • $demuxer_plugin:分离器插件;
  • $video_decoder_plugin:视频解码器;
  • $video_sink_plugin:视频输出器;

2.1解码H.264 视频

H264 编码格式文件解码显示:

[email protected]:~# gst-launch-1.0 filesrc location=file.h264 typefind=true ! video/x-h264 ! vpudec ! overlaysink -v
[email protected]:~# gst-launch-1.0 filesrc location=file.h264 typefind=true ! video/x-h264 ! vpudec ! imxv4l2sink -v

指定解码后视频的宽度、高度和格式:

# gst-launch-1.0 filesrc location=file.h264 typefind=true ! video/x-h264 ! vpudec ! 'video/x-raw,format=(string)NV12,width=(int)352,height=(int)288' ! imxv4l2sink -v

H264 编码格式文件解码并保存为yuv 格式文件:

[email protected]:~# gst-launch-1.0 filesrc location=file.h264 typefind=true ! video/x-h264 ! vpudec ! filesink location=file.yuv

2.2解码mpeg4 视频

对mpeg4 文件进行解码显示:

# gst-launch-1.0 filesrc location=file.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue max-size-time=0 ! vpudec ! overlaysink -v
# gst-launch-1.0 filesrc location= file.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue ! vpudec ! imxv4l2sink

对mpeg4 编码文件进行解码并指定播放视频的宽度、高度和格式:

[email protected]:~# gst-launch-1.0 filesrc location= 1.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue ! vpudec ! imxv4l2sink overlay-width=200 overlay-height =200 overlay-top=100 overlay-left=100 crop-top=0 crop-left=0 crop-width=0 crop-height=0 rotate=90

把1.mp4 解码为file.yuv 文件:

[email protected]:~#  gst-launch-1.0 filesrc location=1.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue max-size-time=0 ! vpudec ! filesink location=file.yuv -vgst-launch-1.0 filesrc location=file.h263 typefind=true ! video/x-h263 ! vpudec ! overlaysink -v

2.3解码H.263 视频

对H263 文件进行解码显示:

# gst-launch-1.0 filesrc location=file.h263 typefind=true ! video/x-h263 ! vpudec ! overlaysink -v

2.4媒体文件

mp4 格式文件解码显示:

[email protected]:~# gst-launch-1.0 filesrc location=1.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue max-size-time=0 ! vpudec ! overlaysink -v

video/quicktime为声明解码文件为mp4 格式。使用“gst-inspect-1.0 typefindfunctions”命令可以获得各种媒体文件的相应管道编码。例如avi 格式的管道编码为video/x-msvideo,则播放avi 格式文件的命令如下:

gst-launch-1.0 filesrc location= 1.avi typefind=true ! video/x-msvideo ! avidemux ! queue max-size-time=0 ! vpudec ! overlaysink

指定解码显示位置与显示大小:

[email protected]:~# gst-launch-1.0 filesrc location= 1.mp4 typefind=true ! video/quicktime ! aiurdemux ! queue ! vpudec ! imxv4l2sink overlay-width=200 overlay-height =200 overlay-top=100 overlay-left=100 crop-top=0 crop-left=0 crop-width=0 crop-height=0 rotate=90

这里使用imxv4l2sink pad 及其参数设置显示格式。
其他播放器插件
  使用playbin 元素播放视频文件:

[email protected]:~# gst-launch-1.0 playbin uri=file:home/root/1.mp4
[email protected]:~# gst-launch-1.0 playbin uri=file:///home/root/1.avi
[email protected]:~# gst-launch-1.0 playbin uri=file:///home/root/1.mp3

使用gplay 命令播放视频文件:

[email protected]:~#gplay-1.0 / home/root/1.avi
[email protected]:~#gplay-1.0 / home/root/1.mp3

2.5多屏显示

多屏显示使用overlaysink 插件,该插件能实现将多个视频播放复合到同一个显示中(视频叠加)和将视频显示到多个显示器。
  在/usr/share/imx_6q_display_config 文件中设置显示设备的参数。参数如下:

[Display Name] 必设项,指定显示名称,使用overlaysink 的新能“display-x”使能它
device 必设项,需要设置指定显示设备
fmt 显示设备的颜色格式。设置为"RGBP"则为RGB565 16 bit 显示或者设置为
"RGBx"
width 可选项,设置显示宽度,默认为显示器宽度
height 可选项,设置显示高,默认为显示器高度
alpha 可选项,设置通道,默认为0
color_key 可选项,设置颜色key 值,默认为disabled

下面是LVDS(master) + HDMI(slave)显示的imx_6q_display_config 文件内容。

# LVDS display
[master]
device = /dev/video17
Multimedia
fmt = RGBP
width = 1024
height = 768
alpha = 0
# HDMI display
[slave]
device = /dev/video18
fmt = RGBP
width = 1920
height = 1080

2.6色彩转换和视频缩放

通常情况下,为了将GStreamer 输入源和输出源不一致的元素链接在一起,需要使用一个元素对输入源进行颜色空间转换或缩放。
一个可用的视频转换列表:
1.imxvideoconvert_ipu(使用IMX6 IPU)
2.imxvideoconvert_g2d(使用IMX6 GPU)
3.videoconvert

imxvideoconvert_ipu 
  这个插件可以在输入格式为RGB16、BGR、RGB、BGRx、bgrbg、RGBA、ABGR、b1、v308、NV12、YV12、I420、Y42B、Y444 的数据转换为RGB16、BGR、RGB、BGRx、bgrb、RGBA、bgrb、v308、YV12、YV12、I420、Y444 视频格式数据。此外,这个元素还可以在发送帧之前对视频进行分隔。注意,IPU 不能接受非标准的视频分辨率。
imxvideoconvert_g2d:
  该插件可以在输入格式为RGBx、BGRx、RGBA、BGRA、RGB16、NV12、NV21、I420、YV12、YUY2、YV12 数据转换为RGBx、BGRx、RGBA、BGRA、RGB16 格式数据。
videoconvert:
  这是GStreamer 提供的软件视频色彩空间转换器。可以把输入格式为I420、YV12 YUY2、UYVY、AYUV、RGBx、BGRx、xRGB、xBGR、RGBA、BGRA、ARGB、ABGR、RGB、BGR、Y41B、Y42B、YVYU、Y444、v210、v216、NV12、NV21、NV16、NV24、GRAY8、GRAY16_BE、GRAY16_LE、v308、RGB16、BGR16、RGB15、BGR15、UYVP、A420、RGB8P、YUV9、YVU9、IYU1、ARGB64、AYUV64、r210、I420_10LE、I420_10BE、I422_10LE、I422_10BE、Y444_10LE、Y444_10BE、GBR、GBR_10LE、GBR_10BE、NV12_64Z32的数据转换为I420、YV12、YUY2、UYVY、AYUV、RGBx、BGRx、xRGB、xBGR、RGBA、BGRA、ARGB、ABGR、RGB、BGR、Y41B、Y42B、YVYU、Y444、v210、v216、NV12、NV21、NV16、NV24、GRAY8、GRAY16_BE、GRAY16_LE、v308、RGB16、BGR16、RGB15、BGR15、UYVP、A420、RGB8P、YUV9、YVU9、IYU1、ARGB64、AYUV64、r210、I420_10LE、I420_10BE、I422_10LE、I422_10BE、Y444_10LE、Y444_10BE、GBR、GBR_10LE、GBR_10BENV12_64Z32格式数据。

使用gst-launch-1.0 命令进行视频转码的格式为:

# gst-launch-1.0 filesrc location=$filename typefind=true ! $capsfilter ! aiurdemux ! vpudec !
imxvideoconvert_ipu ! $CAPS1 ! vpuenc ! $CAPS2 ! matroskamux ! filesink location=720p.mkv

颜色变换命令如下:

[email protected]:~# gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12 ! imxvideoconvert_ipu ! video/x-raw,format=RGB16 ! imxv4l2sink
[email protected]:~#  gst-launch-1.0 videotestsrc ! video/x-raw,format=YV12 ! imxvideoconvert_g2d ! video/x-raw,format=RGB16 ! imxv4l2sink

大小调整命令如下:

[email protected]:~#  gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12,width=800,height=600 ! imxvideoconvert_ipu ! video/x-raw, width=320, height=200 ! imxv4l2sink
[email protected]:~#  gst-launch-1.0 videotestsrc ! video/x-raw,format=RGB16,width=800,height=600 ! imxvideoconvert_g2d ! video/x-raw, width=640, height=480 ! imxv4l2sink

旋转命令如下:

[email protected]:~# gst-launch-1.0 videotestsrc ! imxvideoconvert_ipu rotation=2 ! imxv4l2sink
[email protected]:~# gst-launch-1.0 videotestsrc ! imxvideoconvert_g2d rotation=2 ! imxv4l2sink

音频解决方案:

使用gst-launch-1.0 命令进行mp3 音频录制的格式为:

# gst-launch-1.0 pulsesrc num-buffers=$NUMBER blocksize=$SIZE ! imxmp3enc ! filesink location=output.mp3

录音时长=\$NUMBER * \$SIZE * 8 / (samplerate * channel *bit width)
  例子:

[email protected]:~# gst-launch-1.0 alsasrc num-buffers=430 blocksize=4096 ! imxmp3enc ! filesink location=output.mp3