目录
很高兴你能看到这篇文章,同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 :
https://www.yuque.com/alive-m4b9n
mplayer 介绍
MPlayer - The Movie Player官方网站
ubuntu 安装 mplayer
sudo apt-get update
sudo apt-get install mplayer
注:上述的 wsl2 也可以使用
arm 平台开发板移植
1️⃣下载 mplayer 官放源码
2️⃣交叉编译源码 (移植)
嵌入式Mplayer的移植、使用_gec6818开发板mplayer-CSDN博客
根据上述移植教程即可成功交叉编译
3️⃣👍配置
下载 mplayer 播放器到开发板的bin 目录4️⃣设置权限 并测试
chmod 777 /bin/mplayer
mplayer xxx.avi
已交叉编译好的源码,下载开箱即食
mplayer.zip
mplayer 基本使用
播放本地视频
mplayer video.mp4
播放网络视频
mplayer https://example.com/video.mp4
播放音频
mplayer song.mp3
mplayer 视频控制
指定开始播放的位置
mplayer -geometry 100:100 video.mp4
100:100
表示左上角坐标(X, Y)
缩放视频窗口大小
mplayer -zoom -x 800 -y 480 video.mp4
- 强制缩放到
800*480
分辨率
调整亮度、对比度、饱和度
mplayer -vf eq2=1.2:1.1:0.9 video.mp4
eq2=亮度:对比度:饱和度
mplayer 音频控制
调整音量
mplayer -volume 50 video.mp4
0-100
之间
选择音轨
mplayer -aid 2 video.mp4
-aid
选择第 2 个音轨
调整音频延迟
mplayer -delay -0.5 video.mp4
-0.5
秒(提前)0.5
秒(延后)
👍mplayer 常用播放格式
mplayer -slave -quiet -input file=/pipe -geometry 0:0 -zoom -x 400 -y 400 mn.avi
- -input file=/pipe 指定控制命令的管道文件
- slave : 进入从模式状态 ,可以使用命令控制
- quiet : 去除杂项信息
- geometry 0:0 : 设置开始的播放位置
- zoom -x 400 -y 400 : 设置播放窗体的大小 mn.avi :需要播放的视频或音频
👍mplayer 的 -slave
模式
-slave` 选项是 MPlayer 的从属模式(slave mode),它允许外部程序或脚本通过
标准输入(stdin)
发送指令来控制 MPlayer,而不是使用键盘或鼠标。
核心作用:
1️⃣ 允许 MPlayer接受命令(如播放、暂停、调整音量)。
2️⃣ 支持 管道(FIFO)、shell 脚本、Python 代码等方式进行远程控制。
3️⃣ 可以获取 MPlayer 播放状态(如当前播放时间、音量、播放的文件名等)。
4️⃣ 适用于嵌入式系统、远程控制、媒体播放器自动化等场景。
-slave
模式的基本用法
mplayer -slave -quiet video.mp4
-slave
启用从属模式,MPlayer 不会从键盘获取交互输入,而是 等待外部命令。-quiet
减少控制台输出,避免干扰。
方式 1:从控制台输入控制命令(测试使用)
常用的命令
loadfile string //参数string 为 歌曲名字。
volume 100 1 //设置音量 中间的为音量的大小。
mute 1/0 //静音开关
pause //暂停/取消暂停
get_time_length //返回值是播放文件的长度,以秒为单位。
seek value //向前查找到文件的位置播放 参数value为秒数。
get_percent_pos /返回文件的百分比(0–100)
get_time_pos //打印出在文件的当前位置用秒表示,采用浮点数
volume [abs] //增大/减小音量
quit [value] //退出MPlayer。可选的整数[value]的值作为返回代码 为mplayer的进程(默认值:0)。
get_file_name //打印出当前文件名
get_meta_album //打印出当前文件的’专辑’的元数据
get_meta_artist //打印出当前文件的’艺术家’的元数据
get_meta_comment //打印出当前文件的’评论’的元数据
get_meta_genre //打印出当前文件的’流派’的元数据
get_meta_title //打印出当前文件的’标题’的元数据
get_meta_year //打印出当前文件的’年份’的元数据
💡方法 2:从有名管道(fifo)输入控制命令(应用编程中使用)
- 主线程: 监听用户输入(暂停、快进、音量调节等)。
- 子线程: 通过 FIFO 发送指令给 MPlayer 进行控制。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <signal.h>
#define FIFO_PATH "/home/li/pipe"
void *mplayer_control(void *arg);
void send_command(const char *command);
int is_mplayer_running = 1;
int main() {
// 忽略 SIGPIPE 防止 MPlayer 崩溃
signal(SIGPIPE, SIG_IGN);
// 确保 FIFO 存在
if (access(FIFO_PATH, F_OK) == -1) {
if (mkfifo(FIFO_PATH, 0666) == -1) {
perror("创建 FIFO 失败");
exit(EXIT_FAILURE);
}
}
// 启动 MPlayer,使用 X11 输出,禁用 LIRC
FILE *fp = popen("mplayer -vo x11 -nolirc -slave -quiet -input file=/home/li/pipe -geometry 0:0 -zoom -x 400 -y 400 dream.avi", "r");
if (!fp) {
perror("MPlayer 启动失败");
exit(EXIT_FAILURE);
}
sleep(1); // 等待 MPlayer 启动
pthread_t thread_id;
if (pthread_create(&thread_id, NULL, mplayer_control, NULL) != 0) {
perror("线程创建失败");
exit(EXIT_FAILURE);
}
// 监听 MPlayer 退出状态
int status = pclose(fp);
if (WIFEXITED(status)) {
printf("MPlayer 进程已退出\n");
is_mplayer_running = 0;
pthread_cancel(thread_id); // 终止线程
}
pthread_join(thread_id, NULL);
return 0;
}
// 发送命令到 MPlayer
void send_command(const char *command) {
int fifo_fd = open(FIFO_PATH, O_WRONLY | O_NONBLOCK);
if (fifo_fd == -1) {
perror("FIFO 打开失败,MPlayer 可能已经退出");
return;
}
write(fifo_fd, command, strlen(command));
write(fifo_fd, "\n", 1);
close(fifo_fd);
}
// 线程函数:监听用户输入并发送命令
void *mplayer_control(void *arg) {
char input[100];
while (is_mplayer_running) {
printf("\n请输入命令(play/pause/seek+/seek-/vol+/vol-/quit):");
scanf("%s", input);
if (strcmp(input, "pause") == 0) {
send_command("pause");
} else if (strcmp(input, "seek+") == 0) {
send_command("seek 10 0");
} else if (strcmp(input, "seek-") == 0) {
send_command("seek -10 0");
} else if (strcmp(input, "vol+") == 0) {
send_command("volume 5 0");
} else if (strcmp(input, "vol-") == 0) {
send_command("volume -5 0");
} else if (strcmp(input, "quit") == 0) {
send_command("quit");
break;
} else {
printf("未知命令,请输入 play/pause/seek+/seek-/vol+/vol-/quit\n");
}
}
return NULL;
}