0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于ESM6802的多媒体编程应用方案

英创信息技术 作者:英创信息技术 2019-10-11 17:23 次阅读

ESM6802是英创公司推出的基于Freescale i.MX6DL双核处理器(ARM Cortex-A9,主频1GHz)的高性能工控主板。我们在ESM6802上做了针对性的优化来使其更好的支持多媒体音视频的处理,在测试时我们的环境及测试效果如下表所示:

硬件环境
开发板 ESM6802
CPU i.MX6DL
硬件视频处理模块(VPU) √ 用于视频编解码等处理
硬件图像处理模块(GPU √ 用于应用界面的图像显示
内存 1GB 64位DDR3
存储 4GB eMMC高速存储
显示 8.4吋LVDS显示屏800x600
摄像头 罗技C310USB摄像头
软件环境及配置
操作系统 Linux
图形界面 X11
编程 Qt-5.8.0
开发环境 QtCreator
音频格式 MP3
视频格式 H264(选用),H263,MP4等
视频分辨率 640x480 30帧
视频封装格式 Flv
运行效果 优化后的系统 未优化的系统
硬件加速
录制效果 流畅无卡顿 完全卡死
CPU占用率 49.1% >100%
CPU温度 71.1℃ 75.0℃

下面将介绍ESM6802上面的多媒体编程应用方案供客户在实际开发中参考。

1、应用程序图形界面

在处理多媒体时,需要提供一个良好的控制界面,来控制音视频的播放或者录制。ESM6802提供了X11和Qt5.8.0来给客户提供一个良好的编程环境,X11平台能够使用imx6dl处理器内部的GPU模块,使得图像显示获得硬件加速,但是X11一般不作为直接的开发环境来搭建应用程序,实际使用中多是选择更加高级的库比如Qt以及gtk,在此我们选择Qt进行介绍。ESM6802中预装了Qt 5.8.0版本。Qt运行于X11(Qt概念中的xcb平台)上又能获益于X11得到的硬件图形显示加速,从而提升Qt的运行效果。Qt官方提供了很完整的文档以及应用示例作为开发的参考的资料,我们不再详细介绍着写内容,下面我们将展示Qt例程中的camera以及player的界面,两者显示效果如下例图片,其中camera提供了拍照和录像两种模式,两个模式分别有自己不同的设置界面;player提供了文件选择功能,可以方便的浏览选择视频文件:

图1camera显示界面

图2录像设置界面

图3拍照设置界面

图4player播放界面

这两个程序的源码都可以在Qt源码中获得,或者在QtCreator的示例选择界面获得,也可以向我们的工程师获取。

为了方便监视程序运行的CPU占用以及CPU温度,我们在camera例程中增加了部分代码,添加两个标签用于展示CPU占用率以及CPU温度。部分代码如下:

通过读取/proc/stat文件获取CPU占用率:

void CPUINFO::read_cpu_jiffy(jiffy_counts_t *p_jif)

{

FILE *fp = fopen("/proc/stat", "r");

static const char fmt[] = "cpu %llu %llu %llu %llu %llu %llu %llu %llu";

int ret;

char line_buf[80];

if (!fgets(line_buf, 80, fp) || line_buf[0] != 'c' /* not "cpu" */)

return ;

ret = sscanf(line_buf, fmt,

&p_jif->usr, &p_jif->nic, &p_jif->sys, &p_jif->idle,

&p_jif->iowait, &p_jif->irq, &p_jif->softirq,

&p_jif->steal);

if (ret >= 4) {

p_jif->total = p_jif->usr + p_jif->nic + p_jif->sys + p_jif->idle

+ p_jif->iowait + p_jif->irq + p_jif->softirq + p_jif->steal;

/* procps 2.x does not count iowait as busy time */

p_jif->busy = p_jif->total - p_jif->idle - p_jif->iowait;

}

fclose(fp);

return;

}

void CPUINFO::get_cpu_load(double *p_load)

{

total = cur.total - pre.total;

busy = cur.busy - pre.busy;

if ((total > busy) && (total > 0) && (busy > 0))

*p_load = (double)busy / (double)total * 100;

}

读取/sys/class/thermal/thermalzone0/temp文件获取CPU温度:

void CPUINFO::read_cpu_temp(unsigned int *p_temp)

{

FILE *fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");

fscanf(fp, "%u", p_temp);

fclose(fp);

return;

}

加入CPU占用率和CPU温度检测后的界面如下,CPU信息显示在右上角:

2、音视频处理

Freescale官方针对imx6dl的硬件编解码器提供了特有的gstreamer插件,gstreamer是一个基于流水线的流媒体处理框架,以插件的形式提供对不同格式的音视频处理的支持。使用Gstreamer可以很容易地创建各种多媒体功能组件,包括简单的音视频回放、录制、编辑等,但是对于不熟悉Gstreamer框架的客户可能独立使用Gstreamer编程有一定困难,因此我们将是用Qt的多媒体处理模块来进行音视频的播放和录制。Qt的多媒体处理模块(multimedia)是基于Gstreamer的,我们将Qt 的multimedia模块编译进了ESM6802的文件系统,同时针对imx6dl特有的gstreamer插件修改了Qt源码,使得用户在使用中可以参考Qt官方的编程文档而不需要进行特殊设置,同时又能够使用到硬件加速来处理音视频,包括视频的编解码以及视频的显示。

ESM6802硬件支持的视频格式如下:

支持解码的视频格式为:

●H.264 BP/MP/HP

●VC-1 SP/MP/AP

●MPEG-4 SP/ASP (不包括GMC)

●DivX(Xvid)

●MPEG-1/2

●VP8

●AVS

●MJPEG

支持的编码格式为:

●H.264

●MPEG-4

●H.263

●MJPG

关于更多详细的资料可以参考我们之前的文章以及Qt的官方文档:

《ESM6802视频处理简介》

《ESM6802支持Qt摄像头应用》

《ESM6802支持基于Qt的视频播放》

在进行视频录制时需要自己设置使用的编码格式,视频播放时Qt能够自动选择解码器。我们下面将介绍怎么在应用中选择要使用的编码格式,只有选择硬件编码器支持的格式才能获得赢家加速,我们推荐用户在使用中采用H264的格式,还是以Qt官方例程camera为例,部分代码如下:

//audio codecs 获取支持的音频格式

ui->audioCodecBox->addItem(tr("Default audio codec"), QVariant(QString()));

foreach (const QString &codecName, mediaRecorder->supportedAudioCodecs()) {

QString description = mediaRecorder->audioCodecDescription(codecName);

ui->audioCodecBox->addItem(codecName+": "+description, QVariant(codecName));

}

//sample rate 支持的采样率:

foreach (int sampleRate, mediaRecorder->supportedAudioSampleRates()) {

ui->audioSampleRateBox->addItem(QString::number(sampleRate), QVariant(sampleRate));

}

ui->audioQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));

//video codecs 支持的视频编码格式

ui->videoCodecBox->addItem(tr("Default video codec"), QVariant(QString()));

foreach (const QString &codecName, mediaRecorder->supportedVideoCodecs()) {

QString description = mediaRecorder->videoCodecDescription(codecName);

ui->videoCodecBox->addItem(codecName+": "+description, QVariant(codecName));

}

ui->videoQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));

//video codecs 支持的分辨率

ui->videoResolutionBox->addItem(tr("Default"));

QList supportedResolutions = mediaRecorder->supportedResolutions();

foreach (const QSize &resolution, supportedResolutions) {

ui->videoResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()),QVariant(resolution));

}

ui->videoFramerateBox->addItem(tr("Default"));

QList supportedFrameRates = mediaRecorder->supportedFrameRates();

qreal rate;

foreach (rate, supportedFrameRates) {

QString rateString = QString("%1").arg(rate, 0, 'f', 2);

ui->videoFramerateBox->addItem(rateString, QVariant(rate));

}

//containers 支持的封装格式

ui->containerFormatBox->addItem(tr("Default container"), QVariant(QString()));

foreach (const QString &format, mediaRecorder->supportedContainers()) {

ui->containerFormatBox->addItem(format+":"+mediaRecorder->containerDescription(format), QVariant(format));

设置采用的视频格式等参数

void VideoSettings::setAudioSettings(const QAudioEncoderSettings &audioSettings)

{

return;

selectComboBoxItem(ui->audioCodecBox, QVariant(audioSettings.codec()));

selectComboBoxItem(ui->audioSampleRateBox, QVariant(audioSettings.sampleRate()));

ui->audioQualitySlider->setValue(audioSettings.quality());

}

void VideoSettings::setVideoSettings(const QVideoEncoderSettings &videoSettings)

{

selectComboBoxItem(ui->videoCodecBox, QVariant(videoSettings.codec()));

selectComboBoxItem(ui->videoResolutionBox, QVariant(videoSettings.resolution()));

ui->videoQualitySlider->setValue(videoSettings.quality());

//special case for frame rate

for (int i = 0; i < ui->videoFramerateBox->count(); ++i) {

qreal itemRate = ui->videoFramerateBox->itemData(i).value();

if (qFuzzyCompare(itemRate, videoSettings.frameRate())) {

ui->videoFramerateBox->setCurrentIndex(i);

break;

}

}

}

在使用中进入camera程序的录制视频的设置界面就可以看到各个设置支持的参数, 然后可以手动选择要使用的参数,之后点击OK就能是设置生效。用户在自己的应用程序中可以选择固定的参数简化应用程序,使用硬件编码加速视频的录制。

3、总结

imx6dl处理器内部提供了针对多媒体处理和图像显示的硬件模块来辅助相关功能的实现,在编程中使用这些硬件模块提供的功能能够加速应用的处理过程,减小CPU等系统资源的占用。我们针对这些硬件模块定制了ESM6802的文件系统,提供了Qt+X11的平台来简化客户的应用程序开发过程,用户使用Qt来开发自己的图形界面多媒体处理程序可以直接参考Qt官方的文档进行编程,就可以使用到ESM6802的硬件资源,而不需要做特殊设置。实际测试中,在我们修改过的Qt上运行程序CPU占用率以CPU温度都相对于没有进过修改的程序有明显的改善。开发中用户可以参考以上介绍的程序中的源码来实现自己需要的功能,有兴趣的客户可以直接和我们的工程师进行沟通获取相关资料以及程序源码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11196

    浏览量

    208659
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6084

    浏览量

    35148
收藏 人收藏

    评论

    相关推荐

    双核A9工控主板ESM6802即将入市

      ESM6802采用NXP 双核Cortex-A9 CPU i.MX6DL,可预装正版WEC7或Linux-4.1.15操作系统,ESM6802核心单元配备了1GB 64-bit DDR3内存
    发表于 01-03 15:51

    ESM6802双屏显示(LVDS+HDMI)设置

    支持 和 多媒体音视频 )中分别进行介绍。用户阅读完下面的内容之后可以进行随意组合使用双屏显示不同或相同内容。2、Qt5支持  ESM6802 文件系统已经移植好了Qt 5.5.1 版本,支持qml等
    发表于 01-26 10:41

    WinCE工控主板ESM6802对音频的支持

      ETA972是采用Cirrus Logic的CS4272音频解码芯片的音频扩展模块,ESM6802提供了一路I2S信号可与ETA972相连,以支持音频播放功能。ESM6802的I2S接口
    发表于 04-05 15:47

    ESM6802多媒体应用方案

    完全卡死CPU占用率49.1%>100%CPU温度71.1℃75.0℃  下面将介绍ESM6802上面的多媒体编程应用方案供客户在实际开发中参考。1、应用程序图形界面在处理
    发表于 10-19 15:38

    ESM6802支持基于Qt的视频播放

      iMX6DL是工控主板ESM6802主板的核心芯片,该芯片支持多种常见视频格式的硬件编解码,可以流畅的播放视频。目前ESM6802文件系统中已经移植了Qt5.8.0,可全面支持
    发表于 10-19 16:41

    ESM6802支持Qt摄像头应用

      ESM6802是英创公司推出的基于Freescale i.MX6DL双核处理器(ARM Cortex-A9,主频1GHz)的高性能工控主板,已经移植了Linux 4.1.15版本以及Qt 5.8
    发表于 10-20 10:33

    ESM6802视频处理简介

    文档。4、Qt 5.8多媒体处理模块  ESM6802文件系统已经移植了Qt 5.8,Qt的多媒体处理模块是基于GStreamer框架搭建的,用户在编写程序时可以调用Qt提供的API来进行视频处理
    发表于 10-20 10:36

    用于WinCE的ESM6802 SDK

    ESM6802 SDK for WinCE
    发表于 09-27 11:18

    ESM6802上烧写Android系统的过程

    ESM6802 Android版烧写说明
    发表于 09-27 11:15

    ESM6802工控主板技术参考手册

    ESM6802工控主板技术参考手册
    发表于 09-27 06:44

    基于WEC7的ESM6802工控主板使用手册

    ESM6802工控主板使用必读(WEC7)
    发表于 09-27 11:19

    ESM6802工控主板相关技术指标

    ESM6802工控主板数据手册
    发表于 09-27 13:09

    英创信息技术WinCE工控主板ESM6802对音频的支持

    ETA972是采用Cirrus Logic的CS4272音频解码芯片的音频扩展模块,ESM6802提供了一路I2S信号可与ETA972相连,以支持音频播放功能。ESM6802的I2S接口与GPIO
    的头像 发表于 02-05 11:15 1538次阅读
    英创信息技术WinCE工控主板<b class='flag-5'>ESM6802</b>对音频的支持

    英创信息技术ESM6804与ESM6802性能对比简介

    ESM6804是在ESM6802基础上升级的更高性能的产品,其采用NXP 四核Cortex-A9 CPU i.MX6Q,而ESM6802使用的是NXP的双核Cortex-A9 i.MX6DL,两者
    的头像 发表于 02-07 10:41 1357次阅读
    英创信息技术<b class='flag-5'>ESM</b>6804与<b class='flag-5'>ESM6802</b>性能对比简介

    英创信息技术ESM6802主板1920x1080高清显示的两种接口简介

    采用HDMI或者双通道LVDS接口方式,以提高其抗干扰的能力,其中关于ESM6802双通道LVDS信号接口定义,请参考公司网站上《ESM6802支持双通道LVDS高清大屏显示》一文中有详细的介绍。本文
    的头像 发表于 02-12 10:31 1673次阅读
    英创信息技术<b class='flag-5'>ESM6802</b>主板1920x1080高清显示的两种接口简介