<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 基于Linux主板ESM6802的完整視頻應用平臺

     2017-9-1     作者:廖光澤        
    文章標簽:C/C++視頻

      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提供了文件選擇功能,可以方便的瀏覽選擇視頻文件:


    ESM6802多媒體應用方案.gif

    圖1 camera顯示界面


    ESM6802多媒體應用方案.gif

    圖2 錄像設置界面


    ESM6802多媒體應用方案.gif

    圖3 拍照設置界面


    ESM6802多媒體應用方案.gif

    圖4 player播放界面


      這兩個程序的源碼都可以在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信息顯示在右上角:


    ESM6802多媒體應用方案.gif


    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<QSize> 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<qreal> 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<qreal>();

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

                ui->videoFramerateBox->setCurrentIndex(i);

                break;

          }

      }

      }


      在使用中進入camera程序的錄制視頻的設置界面就可以看到各個設置支持的參數, 然后可以手動選擇要使用的參數,之后點擊OK就能是設置生效。用戶在自己的應用程序中可以選擇固定的參數簡化應用程序,使用硬件編碼加速視頻的錄制。


    3、總結


      imx6dl處理器內部提供了針對多媒體處理和圖像顯示的硬件模塊來輔助相關功能的實現,在編程中使用這些硬件模塊提供的功能能夠加速應用的處理過程,減小CPU等系統資源的占用。我們針對這些硬件模塊定制了ESM6802的文件系統,提供了Qt+X11的平臺來簡化客戶的應用程序開發過程,用戶使用Qt來開發自己的圖形界面多媒體處理程序可以直接參考Qt官方的文檔進行編程,就可以使用到ESM6802的硬件資源,而不需要做特殊設置。實際測試中,在我們修改過的Qt上運行程序CPU占用率以CPU溫度都相對于沒有進過修改的程序有明顯的改善。開發中用戶可以參考以上介紹的程序中的源碼來實現自己需要的功能,有興趣的客戶可以直接和我們的工程師進行溝通獲取相關資料以及程序源碼。

    文章標簽:C/C++視頻
    国产午夜无码精品免费看| 国产免费久久精品99re丫y| 午夜精品一区二区三区在线观看| 国产精品一区二区不卡| 国产精品无码一区二区三级| 人成精品视频三区二区一区| 亚洲国产精品美女久久久久| 无码人妻丰满熟妇精品区| 精品无码三级在线观看视频| 国产精品k频道在线看| 亚洲精品中文字幕无码A片老| 99精品免费观看| 国产成人精品日本亚洲| 久久久久99精品成人片牛牛影视| 国产天堂亚洲精品| 精品久久久久久久99热| 国产va精品免费观看| 亚洲国产成人久久99精品| 久久99久久精品视频| 伊人久久精品无码av一区| 精品国产一级在线观看| 一本精品99久久精品77| 国产成人青青热久免费精品| 久久无码av亚洲精品色午夜| 国产精品永久免费10000| 久久久久久久久久久精品尤物| 亚洲AV无码久久精品狠狠爱浪潮| 中文精品久久久久人妻不卡| 久久久精品人妻无码专区不卡| 国产精品无打码在线播放| 亚洲国产91精品无码专区| 一本色道久久88综合日韩精品| 国产精品亚洲专区在线播放| 日韩精品国产一区| 国产精品国产三级国产普通话一| 1313午夜精品理论片| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 精品国产美女福利到在线不卡| 久久久久无码国产精品不卡| 精品久久久久久国产免费了| 久久精品国产99久久丝袜|