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

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

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

Linux小項(xiàng)目-廣告機(jī)項(xiàng)目設(shè)計(jì)

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

1. 前言

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

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

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

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

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

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

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

image-20220123222335264image-20220123222434844

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

播放器采用mplayer框架,mplayer支持主模式和從模式播放,為了方便控制mplayer,這里就采用從模式啟動(dòng)mplayer,也就是fork一個(gè)子進(jìn)程運(yùn)行mplayer的播放命令,完成視頻播放。主進(jìn)程里等待mplayer進(jìn)程視頻播放完畢完成新視頻切換,在主線程里還有一個(gè)線程,用來(lái)檢測(cè)服務(wù)器是否有新的視頻文件需要更新,然后在合適的時(shí)間進(jìn)行定時(shí)下載視頻文件。

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
#include 
?
?
/**********************全局變量定義區(qū)*****************/ 
int fd_fifo;          //創(chuàng)建有名管道,用于向mplayer發(fā)送命令  
int fd_pipe[2];         //創(chuàng)建無(wú)名管道,用于從mplayer讀取命令  
char DirName[100][100];     //存放視頻路徑
void listdir(char *argv,char *argv_famt);    //遍歷目錄
int flag=0; //播放標(biāo)志
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)); //從無(wú)名管道的寫端讀取信息打印在屏幕上  
    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)建無(wú)名管道 ? 
? ?  { ?
? ? ? ? ?perror("pipe error\n"); ?
? ? ? ? ?exit(-1); ?
? ?  } ?
? ? ?//遍歷目錄
? ? ?listdir(argv[1],argv[2]); ? 
? ? ?
? ? ?pid=fork();//創(chuàng)建進(jìn)程
? ? ?if(pid<0) ?
? ?  { ?
? ? ? ? ?perror("fork"); ?
? ?  } ?
? ? ?if(pid==0)//子進(jìn)程播放mplayer ? 
? ?  { ?
? ? ? ? ?close(fd_pipe[0]); ? ? ? ?//關(guān)閉讀 
? ? ? ? ?dup2(fd_pipe[1],1); ? ? ? //將子進(jìn)程的標(biāo)準(zhǔn)輸出重定向到管道的寫端 
? ? ? ? ?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); ? ? ?//打印從無(wú)名管道收到的信息 ? 
? ? ? ? ?pthread_join(tid1,NULL); ?
? ? ? ? ?pthread_join(tid2,NULL); ?
? ?  } ?
? ? ?return 0; ?
?} ?
??
??
?//遍歷目錄
?void listdir(char *argv,char *argv_famt)
?{
?    DIR *dir;
? ?//1.打開(kāi)目錄
? ?dir=opendir(argv);
? ?if(dir==NULL)
?  {
? ? ? printf("目錄打開(kāi)失敗!\n");
? ? ? exit(-1);  
?  }
? ?
? ?//2. 讀取目錄
? ?struct dirent *dir_info;
? ?char *abs_address,*p; //絕對(duì)路徑
? ?int len;
? ?int i=0;
? ?while(dir_info=readdir(dir))
?  {
?     //字符串查找
? ? ? if(strstr(dir_info->d_name,argv_famt))
      {
          len=strlen(argv); //傳入的路徑長(zhǎng)度
          len+=strlen(dir_info->d_name); //計(jì)算文件的名稱長(zhǎng)度
          len+=1; //存放'\0'使用。
          
          p=abs_address=malloc(len); //開(kāi)辟存放絕對(duì)路徑的空間
          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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11215

    瀏覽量

    208741
  • 廣告機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    154

    瀏覽量

    9741
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4913

    瀏覽量

    97086
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux驅(qū)動(dòng)開(kāi)發(fā)_視頻廣告機(jī)開(kāi)發(fā)、Linux進(jìn)程編程介紹

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

    單片機(jī)小項(xiàng)目集合

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

    單片機(jī)小項(xiàng)目

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

    單片機(jī)小項(xiàng)目,可供新手自學(xué)

    單片機(jī)小項(xiàng)目,可供新手自學(xué)
    發(fā)表于 09-22 15:13

    求做小項(xiàng)目

    求助:初學(xué)單片機(jī),想做個(gè)小項(xiàng)目,哪位同仁可以介紹介紹有什么好項(xiàng)目學(xué)習(xí)一下的。{:soso_e132:}
    發(fā)表于 09-27 00:32

    免費(fèi) 代做51單片機(jī)小項(xiàng)目

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

    單片機(jī)小項(xiàng)目開(kāi)源分享

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

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

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

    單片機(jī)的一些小項(xiàng)目資料

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

    使用安卓藍(lán)牙控制51單片機(jī)的一些小項(xiàng)目總結(jié)

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

    Linux應(yīng)用小項(xiàng)目的解碼庫(kù)移植源代碼免費(fèi)下載

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

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

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

    STM32學(xué)習(xí)——入門小項(xiàng)目

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

    Arduino Bootcamp師生小項(xiàng)目

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

    Linux小項(xiàng)目-數(shù)碼相冊(cè)設(shè)計(jì)

    這是基于Linux系統(tǒng)開(kāi)發(fā)板設(shè)計(jì)一個(gè)小項(xiàng)目-數(shù)碼相冊(cè),在LCD屏上可以顯示完成常見(jiàn)的圖片顯示,翻頁(yè)、旋轉(zhuǎn)、縮放等功能。
    的頭像 發(fā)表于 08-14 09:15 ?1898次閱讀