mplayer專案(linux環境)
基本功能
- 播放歌曲
- 前臺控制:播放、暫停、上一首、下一首。
- 顯示當前歌曲列表。
- 顯示歌曲資訊(歌曲總長度、當前播放時間、歌曲進度百分比、歌手名)。
- 自動播放下一首。
- 同步顯示歌詞(擴充套件)。
流程圖
mplayer啟動方式
execlp("mplayer", "mplayer", "-slave", "-quiet", "-idle", "-input", "file=./cmdfifo", name, NULL);
//cmdfifo是命名管道,當寫入命令資料後,mplayer自動讀取執行
//name是帶路徑的歌曲名稱
引數:
- -slave 執行在從模式,從命令列讀取以新行(\n)分隔開的命令列。
- -quiet 使得控制檯輸出訊息較少。
- -idle 播放至檔案結尾後,mplayer不退出。
- -input file=./cmdfifo 通過命令管道 ./cmdfifo獲取命令。
- ./ShapeofMyHeart.mp3 歌曲的路徑 +檔名。
- NULL exec 系統呼叫必備。
Mplayer在 slave模式下常用的命令
- loadfile string //播放 string指定的歌曲
- volume x 1 //設定音量
- mute 1/0 //靜音開關, 1:靜音, 0:取消靜音
- pause //暫停 //取消暫停
- seek value //快進或退的秒數, value為正時,快進; value為負時,快退。
- get_percent_pos //獲取檔案的播放進度(百分比: 0-100)
- get_time_pos //獲得檔案的當前位置,以秒為單位,精確到小數點後 1位。
- get_file_name //獲得當前播放的檔名
- get_time_length //獲得檔案的長度,以秒為單位
- get_meta_album //獲得檔案的“專輯”元資料
- get_meta_artist //獲得檔案的“藝術家”元資料
- get_meta_commnet //獲得檔案的“評論”元資料
- get_meta_genre //獲得檔案的“流派”元資料
- get_meta_title //獲得檔案的“標題”元資料
- 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 PIL(linux環境下)
很喜歡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,將解壓後的檔案拷入新建的