RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux小項目-廣告機項目設計

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:14 ? 次閱讀

1. 前言

廣告機是新一代的智能設備,通過終端軟件控制、網(wǎng)絡信息傳輸和多媒體終端顯示構(gòu)成一個完整的廣告播控系統(tǒng),并通過圖片、文字、視頻、小插件(天氣、匯率等)等多媒體素材進行廣告宣傳。

廣告機最初的構(gòu)想是將廣告變被動為主動,所以廣告機的互動性使得它具備很多公共服務功能,并以此來吸引顧客主動瀏覽廣告。

在城市里,廣告機大家應該都不陌生,在地鐵、公交車、商場、銀行、廣場、電梯里很多人流量大的地方都有廣告機,投放各種宣傳廣告。銀行的廣告機一般投放理財、貸款、活動、利率一些信息,酒店的廣告機一般宣傳自己的酒店設施、配置;電梯、地鐵、公交車里的廣告機主要是投放各個商家的廣告,比如:附近哪家火鍋店打折扣呀,飯店開張呀、商家的新產(chǎn)品上市等等。

廣告機一般都是主動播放視頻廣告,循環(huán)播放,用戶不能去主動調(diào)整廣告機視頻,這篇文章就介紹如何利用Linux開發(fā)板做一個廣告機項目,完成廣告機的主要功能。

廣告機主要是播放視頻,所以需要一個視頻播放器,上篇文章介紹了mplayer的交叉編譯,在Linux開發(fā)板上已經(jīng)完成了視頻的播放,所以這篇文章就只是介紹在應用層如何完成廣告機的邏輯代碼設計。

開發(fā)板采用友善之臂的Tiny4412,板子上待遇聲卡設備也帶有現(xiàn)成的驅(qū)動,所以LCD屏的驅(qū)動、聲卡驅(qū)動都不用從頭開發(fā),只需要注重應用層開發(fā)。

廣告機除了循環(huán)播放視頻以外,還需要實現(xiàn)網(wǎng)絡視頻更新,需要搭建一個服務器完成方便廣告機自動下載最新的廣告視頻文件,自動更新。

image-20220123222335264image-20220123222434844

2. 項目實現(xiàn)代碼

播放器采用mplayer框架,mplayer支持主模式和從模式播放,為了方便控制mplayer,這里就采用從模式啟動mplayer,也就是fork一個子進程運行mplayer的播放命令,完成視頻播放。主進程里等待mplayer進程視頻播放完畢完成新視頻切換,在主線程里還有一個線程,用來檢測服務器是否有新的視頻文件需要更新,然后在合適的時間進行定時下載視頻文件。

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
#include 
?
?
/**********************全局變量定義區(qū)*****************/ 
int fd_fifo;          //創(chuàng)建有名管道,用于向mplayer發(fā)送命令  
int fd_pipe[2];         //創(chuàng)建無名管道,用于從mplayer讀取命令  
char DirName[100][100];     //存放視頻路徑
void listdir(char *argv,char *argv_famt);    //遍歷目錄
int flag=0; //播放標志
int VideoNum=0; //視頻總數(shù)量
//從鍵盤獲取將要寫入的命令 
void *get_pthread(void *arg) 
{ 
  char buf[100];
  char cmd[]="get_percent_pos\n";
  int i=0; 
  while(1) 
   { 
       sleep(2);
        if(write(fd_fifo,cmd,strlen(cmd))!=strlen(cmd))
        {
          perror("write error 1_!\n"); 
        }
       if(flag)
       {
           flag=0;
                strcpy(buf,"loadfile ");
                strcat(buf,DirName[i]);
                strcat(buf,"\n\0");
                //寫到播放器mplayer那一端      
                if(write(fd_fifo,buf,strlen(buf))!=strlen(buf)) 
                perror("write error!\n"); //將命令寫入命名管道 
                i++; 
                if(i>=VideoNum)//判斷視頻文件是否到結(jié)尾
                {
                  i=0; 
                }      
       }          
   } 
} 
?
void *print_pthread(void *arg) 
{ 
  char buf[100];
  char num[3]; 
  close(fd_pipe[1]); //關(guān)閉寫端。
  int size=0; 
  int i=0; 
  while(1) 
   { 
           memset(buf,0,100);
    size=read(fd_pipe[0],buf,sizeof(buf)); //從無名管道的寫端讀取信息打印在屏幕上  
    buf[size]='\0'; 
    char *p=strstr(buf,"=");
    if(p!=NULL)
     {
         num[0]=*(p+1);
         num[1]=*(p+2);
         if(atoi(num)>90)
         {
             flag=1; //切換視頻
             printf("切換視頻......%d->\n",i);       
         }
     } 
    printf("buf=%s    \n",buf);   
   } 
} 
?
int main(int argc, char *argv[]) 
{ 
    
     if(argc!=3)
        {
            printf("格式: ./app <目錄> <文件后綴>\n");
            exit(-1);
        }
  int fd; 
  char buf[100]; 
  pid_t pid; 
   
  unlink("/my_fifo");//如果命名管道存在,則先刪除  
  mkfifo("/my_fifo",O_CREAT|0666); 
   
  if (pipe(fd_pipe)<0 ) //創(chuàng)建無名管道 ? 
? ?  { ?
? ? ? ? ?perror("pipe error\n"); ?
? ? ? ? ?exit(-1); ?
? ?  } ?
? ? ?//遍歷目錄
? ? ?listdir(argv[1],argv[2]); ? 
? ? ?
? ? ?pid=fork();//創(chuàng)建進程
? ? ?if(pid<0) ?
? ?  { ?
? ? ? ? ?perror("fork"); ?
? ?  } ?
? ? ?if(pid==0)//子進程播放mplayer ? 
? ?  { ?
? ? ? ? ?close(fd_pipe[0]); ? ? ? ?//關(guān)閉讀 
? ? ? ? ?dup2(fd_pipe[1],1); ? ? ? //將子進程的標準輸出重定向到管道的寫端 
? ? ? ? ?execl("/work/mplayer/MPlayer-1.3.0/_install/bin/mplayer","/work/mplayer/MPlayer-1.3.0/_install/bin/mplayer","-zoom","-x","800","-y","480","-slave","-quiet","-input","file=/my_fifo","1.wmv",NULL); ?
? ?  } ?
? ? ?else ?
? ?  { ?
? ? ? ? ?pthread_t tid1; ?
? ? ? ? ?pthread_t tid2; ?
? ? ? ? ?fd_fifo=open("/tmp/my_fifo",O_RDWR); ?
? ? ? ? ?if(fd<0) ?
? ? ? ? ? ? ?perror("open"); ?
? ? ? ? ? ? ? ?
? ? ? ? ?pthread_create(&tid1,NULL,get_pthread,NULL); ? ? ? ?//從鍵盤獲取控制信息 ? 
? ? ? ? ?pthread_create(&tid2,NULL,print_pthread,NULL); ? ? ?//打印從無名管道收到的信息 ? 
? ? ? ? ?pthread_join(tid1,NULL); ?
? ? ? ? ?pthread_join(tid2,NULL); ?
? ?  } ?
? ? ?return 0; ?
?} ?
??
??
?//遍歷目錄
?void listdir(char *argv,char *argv_famt)
?{
?    DIR *dir;
? ?//1.打開目錄
? ?dir=opendir(argv);
? ?if(dir==NULL)
?  {
? ? ? printf("目錄打開失敗!\n");
? ? ? exit(-1);  
?  }
? ?
? ?//2. 讀取目錄
? ?struct dirent *dir_info;
? ?char *abs_address,*p; //絕對路徑
? ?int len;
? ?int i=0;
? ?while(dir_info=readdir(dir))
?  {
?     //字符串查找
? ? ? if(strstr(dir_info->d_name,argv_famt))
      {
          len=strlen(argv); //傳入的路徑長度
          len+=strlen(dir_info->d_name); //計算文件的名稱長度
          len+=1; //存放'\0'使用。
          
          p=abs_address=malloc(len); //開辟存放絕對路徑的空間
          strcpy(abs_address,argv);//拷貝路徑
          strcat(abs_address,dir_info->d_name);
          strcpy(DirName[i++],abs_address); //存放路徑
          free(p);
   }
  }
 
 VideoNum=i;
 //3. 關(guān)閉目錄
 closedir(dir);    
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209323
  • 廣告機
    +關(guān)注

    關(guān)注

    0

    文章

    157

    瀏覽量

    9768
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
收藏 人收藏

    評論

    相關(guān)推薦

    Linux驅(qū)動開發(fā)_視頻廣告開發(fā)、Linux進程編程介紹

    介紹Linux下進程編程、進程的創(chuàng)建、進程通信、完成廣告項目代碼。
    的頭像 發(fā)表于 09-17 15:49 ?1200次閱讀
    <b class='flag-5'>Linux</b>驅(qū)動開發(fā)_視頻<b class='flag-5'>廣告</b><b class='flag-5'>機</b>開發(fā)、<b class='flag-5'>Linux</b>進程編程介紹

    單片小項目集合

    ` 本帖最后由 zgzzlt 于 2012-8-28 10:35 編輯 單片小項目集合`
    發(fā)表于 08-06 15:26

    單片小項目

    本帖最后由 eehome 于 2013-1-5 09:47 編輯 單片小項目
    發(fā)表于 08-26 11:59

    單片小項目,可供新手自學

    單片小項目,可供新手自學
    發(fā)表于 09-22 15:13

    求做小項目

    求助:初學單片,想做個小項目,哪位同仁可以介紹介紹有什么好項目學習一下的。{:soso_e132:}
    發(fā)表于 09-27 00:32

    免費 代做51單片小項目

    出于本人對單片的熱愛,現(xiàn)免費為有需要者代做51單片小項目。由需求者自己在網(wǎng)上買元器件,郵寄給本人。項目調(diào)試完成再郵寄給需求者。承諾免費代做。
    發(fā)表于 08-16 15:02

    單片小項目開源分享

    轉(zhuǎn)眼間已經(jīng)工作一年,目前從事linux/android驅(qū)動工作,將大學期間單片小項目開源出來,供大家交流學習,比較簡單。源碼在git clone http://www.github.com
    發(fā)表于 09-17 11:33

    【YOXIOS X3開發(fā)板(基于Linux的GUI)試用連載】基于linux開發(fā)小項目

    項目名稱:基于linux開發(fā)小項目試用計劃:申請理由:我公司主要的產(chǎn)品是使用linux系統(tǒng)來開發(fā)各種產(chǎn)品。而我只會使用普通的單片開發(fā),一直
    發(fā)表于 07-27 15:05

    單片的一些小項目資料

    單片的一些小項目,單片入門必備,適合初學者
    發(fā)表于 11-18 17:24 ?11次下載

    使用安卓藍牙控制51單片的一些小項目總結(jié)

    本文檔的主要內(nèi)容詳細介紹的是使用安卓藍牙控制51單片的一些小項目總結(jié)。
    發(fā)表于 07-18 17:38 ?14次下載
    使用安卓藍牙控制51單片<b class='flag-5'>機</b>的一些<b class='flag-5'>小項目</b>總結(jié)

    Linux應用小項目的解碼庫移植源代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是Linux應用小項目源碼 解碼庫移植、調(diào)用的項目,源碼中有詳細注釋,用交叉工具鏈直接可編譯。
    發(fā)表于 10-24 08:00 ?0次下載

    物聯(lián)網(wǎng)小項目:STM32F103單片通過MQTT協(xié)議連接阿里云

    物聯(lián)網(wǎng)小項目:STM32F103單片通過MQTT協(xié)議連接阿里云
    發(fā)表于 11-19 10:51 ?43次下載
    物聯(lián)網(wǎng)<b class='flag-5'>小項目</b>:STM32F103單片<b class='flag-5'>機</b>通過MQTT協(xié)議連接阿里云

    STM32學習——入門小項目

    STM32學習——入門小項目
    發(fā)表于 12-07 17:21 ?72次下載
    STM32學習——入門<b class='flag-5'>小項目</b>

    Arduino Bootcamp師生小項目

    電子發(fā)燒友網(wǎng)站提供《Arduino Bootcamp師生小項目.zip》資料免費下載
    發(fā)表于 07-28 11:22 ?0次下載
    Arduino Bootcamp師生<b class='flag-5'>小項目</b>

    Linux小項目-數(shù)碼相冊設計

    這是基于Linux系統(tǒng)開發(fā)板設計一個小項目-數(shù)碼相冊,在LCD屏上可以顯示完成常見的圖片顯示,翻頁、旋轉(zhuǎn)、縮放等功能。
    的頭像 發(fā)表于 08-14 09:15 ?1981次閱讀
    RM新时代网站-首页