1. 程式人生 > >mplayer專案(linux環境)

mplayer專案(linux環境)

基本功能

  1. 播放歌曲
  2. 前臺控制:播放、暫停、上一首、下一首。
  3. 顯示當前歌曲列表。
  4. 顯示歌曲資訊(歌曲總長度、當前播放時間、歌曲進度百分比、歌手名)。
  5. 自動播放下一首。
  6. 同步顯示歌詞(擴充套件)。

流程圖

mplayer啟動方式

execlp("mplayer", "mplayer", "-slave", "-quiet", "-idle", "-input", "file=./cmdfifo", name, NULL);
//cmdfifo是命名管道,當寫入命令資料後,mplayer自動讀取執行
//name是帶路徑的歌曲名稱

引數:

  1. -slave 執行在從模式,從命令列讀取以新行(\n)分隔開的命令列。
  2. -quiet 使得控制檯輸出訊息較少。
  3. -idle 播放至檔案結尾後,mplayer不退出。
  4. -input file=./cmdfifo 通過命令管道 ./cmdfifo獲取命令。
  5. ./ShapeofMyHeart.mp3 歌曲的路徑 +檔名。
  6. NULL exec 系統呼叫必備。

Mplayer在 slave模式下常用的命令

  1. loadfile string //播放 string指定的歌曲
  2. volume x 1 //設定音量
  3. mute 1/0 //靜音開關, 1:靜音, 0:取消靜音
  4. pause //暫停 //取消暫停
  5. seek value //快進或退的秒數, value為正時,快進; value為負時,快退。
  6. get_percent_pos //獲取檔案的播放進度(百分比: 0-100)
  7. get_time_pos //獲得檔案的當前位置,以秒為單位,精確到小數點後 1位。
  8. get_file_name //獲得當前播放的檔名
  9. get_time_length //獲得檔案的長度,以秒為單位
  10. get_meta_album //獲得檔案的“專輯”元資料
  11. get_meta_artist //獲得檔案的“藝術家”元資料
  12. get_meta_commnet //獲得檔案的“評論”元資料
  13. get_meta_genre //獲得檔案的“流派”元資料
  14. get_meta_title //獲得檔案的“標題”元資料
  15. get_meta_year //獲得檔案的“年份”元資料

程式下載

main.c 程式碼

自我批評:
程式應減少使用較多的全域性變數,防止函式裡重新命名就行覆蓋,產生問題。
專案整體結構還可以調整地更好、更加清晰明瞭。

/*************************************************************************
    > File Name: mplayer.c
    > Author: mrhjlong
    > Mail: [email protected] 
    > Created Time: 2016年07月23日 星期六 15時27分19秒
 ************************************************************************/

#include "songplay.h"

extern int flag;    //顯示資料標誌    1:顯示  0:不顯示
extern Song *pnow;  //當前歌曲結點指標
extern Song *plast; //最後一個歌曲結點指標(使用的是雙向連結串列,不是雙向迴圈連結串列,可以改進)
extern int clsthread;   //關閉執行緒標誌
extern int flagpause;   //暫停標誌
extern int fdpp[2];     //無名管道
extern sem_t sem;       //訊號量

int main(void)
{
    List_head *linklist = get_song_list("./");
    node_print(linklist);
    pnow = linklist->head;
    char name[NAMESIZE] = {0};
    strcat(name, "./");
    strcat(name, pnow->name);

    int ret = sem_init(&sem, 0, 1);  //訊號量初始化
    if(ret == -1)
        err_sys("sem_init error");

    if(access("./cmdfifo", F_OK) == 0) //判斷命名管道是否存在,有則刪除,重新新建
    {
    //  printf("cmdfifo exist\n");
        unlink("./cmdfifo");
        mkfifo("./cmdfifo", 0777);
    }
    else
    {
        mkfifo("./cmdfifo", 0777);
    }

    if(pipe(fdpp) < 0)
        err_sys("pipe error");

    fcntl(fdpp[0], F_SETFL, O_NONBLOCK); //無名管道設為非阻塞

    pid_t pid = fork();  //建立程序
    if(pid < 0)
        err_sys("fork error");
    else if(pid == 0)  //子程序
    {   
        close(fdpp[0]);
        dup2(fdpp[1], 1);   //將標準輸出定向到無名管道的寫入
        execlp("mplayer", "mplayer", "-slave", "-quiet", "-idle", "-input", "file=./cmdfifo", name, NULL);  //命名管道cmdfifo有命令資料,mplayer會自動讀取
    }
    else   //父程序
    {
        close(fdpp[1]);
        sleep(1);

        pthread_t get_tid1, get_tid2, get_tid3;
        ret = 0;

        //建立處理執行緒
        ret = pthread_create(&get_tid1, NULL, getcmd_thread, (List_head *)linklist);
        if(ret != 0)
            err_sys("pthread_create error");

        ret = pthread_create(&get_tid2, NULL, datacmd_thread, NULL);
        if(ret != 0)
            err_sys("pthread_create error");

        //sleep(1);
        //char data[1024] = {0};
        //read(fd[0], data, 1024); //清除冗餘資訊
        ret = pthread_create(&get_tid3, NULL, read_thread, (List_head *)linklist);
        if(ret != 0)
            err_sys("pthread_create error");

        //等待執行緒結束        
        pthread_join(get_tid1, NULL);
        pthread_join(get_tid2, NULL);
        pthread_join(get_tid3, NULL);
        sem_destroy(&sem);  //銷燬訊號量
        list_destroy(linklist);   //銷燬連結串列
    }

    //sleep(1);
    return 0;
}

songplay.h 程式碼

/*************************************************************************
    > File Name: songplay.h
    > Author: mrhjlong
    > Mail: [email protected] 
    > Created Time: 2016年07月24日 星期日 13時08分01秒
 ************************************************************************/

#ifndef __SONGPLAY_H
#define __SONGPLAY_H

#include<stdio.h>
#include"common.h"
#include"songplay.h"
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#include<pthread.h>
#include<semaphore.h>

#define NAMESIZE 50

struct song
{
    char name[NAMESIZE];
    struct song *next;
    struct song *prev;
};

struct list_head
{
    struct song *head;
    int song_num;
};

typedef struct song Song;
typedef struct list_head List_head;

//建立連結串列頭
List_head *head_create(void);

//建立結點
Song *node_create(char *name);

//新增結點到連結串列尾部
void node_insert_tail(List_head *linklist, Song *pSong);

//列印整張連結串列
void node_print(List_head *linklist);

//查詢結點資料,返回結點地址,失敗返回NULL
Song *node_search(List_head *linklist, char *name);

//銷燬整張連結串列
void list_destroy(List_head *linklist);

//獲得歌曲連結串列
List_head *get_song_list(char *pathname);

//帶空格的歌曲名轉換格式,空格前加"\"
void chgform(char *name);

//切換歌曲
void chgsong(char *name);

//處理執行緒讀取的資料
void deal_data(char *data);

//獲取按鍵輸入命令-執行緒
void *getcmd_thread(void *arg);

//讀取資料並處理-執行緒
void *read_thread(void *arg);

//定時傳送命令獲取資料-執行緒
void *datacmd_thread(void *arg);

#endif

相關推薦

mplayer專案linux環境

基本功能 播放歌曲 前臺控制:播放、暫停、上一首、下一首。 顯示當前歌曲列表。 顯示歌曲資訊(歌曲總長度、當前播放時間、歌曲進度百分比、歌手名)。 自動播放下一首。 同步顯示歌詞(擴充套件)。 流程圖 mplayer啟動方式

Ecs服務部署專案Linux環境

安裝jdk: 當使用這個命令安裝時:wget  http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz  

CentOS7.4下建立laravel5.4專案lnmp環境

因為最近在學習linux,學習linux同時安裝LNMP的環境搭配。在這裡記錄下我的centos7.4下安裝laravel的安裝過程。 一、下載composer並安裝 [email protected]_0_16_centos ~]# php -r "copy('https://i

python之Scrapyd部署爬蟲專案虛擬環境

1、新建虛擬環境(方便管理),在虛擬環境中安裝scrapy專案需要使用到的包 進入虛擬環境使用pip將所需包安裝完成 2、開啟命令列工具執行pip install scrapyd 3、輸入scrapyd啟動scrapyd服務,在瀏覽器輸入127.0.0

Zookeeper使用2--ZooKeeper的單機部署Linux環境

這段時間一直在忙工作上的事,原來準備更新Zookeeper的文章,一直沒有時間。看著這個專欄一直空著,還是抽了點時間準備繼續寫下去。這一篇開始,我們來看看如何搭建zookeeper服務。 先從簡單的

websocket 實現伺服器日誌實時反饋linux 環境

在我們線上專案中,版本迭代很多操作需要重新、關閉、開啟應用程式,這樣我們就需要登入伺服器去命令中操作。 如果我們定製開發一個web程式去控制專案的重啟與關閉,這樣就需要在web介面中實時反饋重啟與關閉時的日誌反饋資訊,這樣如果出現異常方便我們及時處理。如果要實

10022--- 白話MyCat——MyCat部署執行Linux環境與使用步驟詳解

原文 MyCAT 可以視為“Mysql”叢集的企業級資料庫,用來替代昂貴的Oracle叢集,其背後是阿里曾經開源的知名產品Cobar。MyCAT的目標是:低成本的將現有的單機資料庫和應用平滑遷移到“雲”端,解決資料儲存和業務規模迅速增長情況下的資料瓶頸問題。 一、部署步

設置JDK環境變量linux

登錄 eclipse .org class pan XML 目錄 必須 set 設置環境變量一、修改/etc/profile文件當本機僅僅作為開發使用時推薦使用這種方法,因為此種配置時所有用戶的shell都有權使用這些環境變量,可能會給系統帶來安全性問題。用文本編輯器打開

kafka+zookeeper環境配置linux環境單機版

producer lai ror detail gin prop tex wget start 版本: CentOS-6.5-x86_64 zookeeper-3.4.6 kafka_2.10-0.10.1.0 一.zookeeper下載與安裝 1)下載 $ wge

C語言編寫Copy程式Linux環境下的操作

COPY程式的編寫 (作者:Baron_wu 禁止轉載) 一、實驗描述 在這個實驗中,我們要做一個程式,這個程式是將一個檔案的內容複製到一個目標檔案。首先這個程式提示使用者輸入要複製的原始檔案的名字,以及要複製到的目標檔案的名字。 確保包括必要的錯誤檢查,包括確保原始檔案存在

docker簡易環境搭建實戰篇:以人人網開源專案renren-fast搭建分散式部署後端篇

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast)搭建分散式部署(後端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 後端最終實現的架構圖: 第一步 簡單瞭解人人開源專案renren-fast 官網:h

C語言獲取當前時間Linux環境下,VC6.0,Codeblock環境下通用

在Linux環境下用C語言編寫程式獲取當前的時間只要呼叫其內部的函式即可。這些函式在 time.h 這個標頭檔案裡,第一個函式原型: ① time_t time(time_t *t),通過Linux的man也很方便能夠找到這個函式的相關說明: 在Linux環境的命令列模式中輸入 man 2 time即

實戰 :對HBase業務表進行增刪改查操作Eclipse,Linux 環境

嘗試使用HBASE shell 和HBase java API 兩種方式來演示對業務表的操作。 一、Hbase Shell 1、啟動控制檯,啟用hbaseshell 控制檯對Hbase 進行操作具體命令如下: [[email protected] hbase]$ bin/h

maven部署專案流程區分環境

java專案區分環境打包部署到Linux 本文以一個簡單的HelloWorld的專案為例,從pom.xml配置到打jar包,最後在linux上執行並驗證來對maven部署的這套流程進行簡單介紹。 為方便講解,本文使用的時springboot框架,其執行函式入口程式如下: @SpringBootAppl

pyenv + virtualenv 建立管理Python虛擬環境Linux系統

python開發環境配置 Python 2和Python 3之間存在著較大的差異,並且,由於各種原因導致了Python 2和Python 3的長期共存。在實際工作過程中,我們可能會同時用到Python 2和Python 3,因此,也需要經常在Python 2和Python 3之間進行來回

大眾點評 cat 專案訪問監控 部署windows環境

1、直接下載zip壓縮包 專案下載 : https://github.com/dianping/cat 需要本地執行cat專案,作為伺服器,在執行的伺服器中檢視客戶端(需要被監控的專案)的訪問情況。下載的專案解壓縮後  script目錄下有“Cat技術入門總結-0.1.0.

python 庫安裝,安裝 numpy matplotlib opencv wxpython PILlinux環境

    很喜歡Ubuntu12.04 下的簡潔的而高貴的介面,vim在裡面也是非常的賞心悅目!所以決定在linux下面來學習python。     這個版本的linux下面自帶了python2.7。輸入命令:python 就可以進入到python指令碼的編寫了。同時也可

NDK環境變數的配置以及編譯方法linux環境

1、下載NDK 2 、配置NDK的環境變數 a 、sudo gedit .bashrc (這裡的bashrc檔案在不同電腦下所在的路徑不同) b 、export PATH=$PATH:/work/

ofbiz最新版13.07.01環境搭建、安裝linux環境

一、軟體必備: 1、jdk1.7 2、mysql5.6 3、安裝tomcat 二、安裝: 1.安裝 JDK1.7 2.安裝mysql資料庫 3.下載apache-ofbiz-13.07.01.zip                                    

mongodb基礎安裝MongoDB 資料庫Windows 和Linux 環境

開啟官網:https://www.mongodb.com/download-center?jmp=nav#community 選擇Community Server 4.0.1 的版本。  安裝與啟動 在D 盤建立安裝目錄,D:\MongoDB,將解壓後的檔案拷入新建的