基于lvgl与mplayer音乐播放器

这篇具有很好参考价值的文章主要介绍了基于lvgl与mplayer音乐播放器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计目标:

1 实现基本的音乐播放器功能

2 显示播放列表

3 实现进度条控制音乐

4 歌词显示

功能描述:

列表选歌

播放暂停,快进快退,上下切歌

设置播放模式,播放速度

调节音量、进度条

设计方案:

多线程、互斥锁、条件变量、信号

界面效果:

mplayer音乐播放器,arm,linux,ui,c语言

 mplayer音乐播放器,arm,linux,ui,c语言

源码文章来源地址https://www.toymoban.com/news/detail-533752.html

#include "lvgl/examples/lv_examples.h"
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include<time.h>
#include <semaphore.h>

extern pthread_mutex_t mutex_lv;//lvgl线程锁

static char local_music_path[]="/root/player/music";//音乐路径
static char local_pic_path[]="/root/player/picture";//图片路径
static char local_words_path[]="/root/player/words";//歌词路径

static char music_path[100][1024];//音乐路径
static char pic_path[100][1024];//图片路径
static char words_path[100][1024];//歌词路径
static char words_buf[5*1024]={0};  //放歌词的数组

static FILE *fp_mplayer=NULL;   //播放器传回的管道,接收播放进度
static FILE *fp_words=NULL;     //歌词文件
static int fd_mplayer = 0;      //定义管道文件描述符,发送指令给mplayer
static int music_num=0;         //音乐数量
static int music_index=-1;      //当前音乐的下标值,用于寻找上下首

static int percent_pos;         //当前播放百分比
static float time_length;       //歌曲长度
static float time_pos;          //当前播放进度

static bool list_flag=1;    //开关列表
static bool words_flag=1;    //歌词列表
static bool play_flag=0;    //播放音乐开关
static bool start=0;        //启动,线程读mplayer返回信息

static lv_style_t font_style;   //中文
static lv_obj_t *play_mode;     //下拉列表对象,播放模式
static lv_obj_t *speed_obj;     //下拉列表对象,播放速度
static lv_obj_t * music_list;   //列表对象
static lv_obj_t *pic_obj;       //图片对象
static lv_obj_t * volume_slider;  //音量滑条对象
static lv_obj_t * play_slider;  //播放进度条对象

static lv_obj_t *title_label;     //图片信息标签
static lv_obj_t *words_label;     //歌词标签
static lv_obj_t * volume_label; //音量标签
static lv_obj_t *time_length_label; //时长标签
static lv_obj_t *time_pos_label; //当前时间标签
static lv_obj_t *words_list;     //歌词标签   

pthread_cond_t cond;        //条件变量,用于暂停读取mplayer
pthread_cond_t cond1;
pthread_mutex_t mutex;
pthread_mutex_t mutex1;

pthread_t tid_read;         //读mplayer的线程id
pthread_t tid_write;        //写mplayer的线程id


//检索本地歌单
void get_music_path()
{
    //读目录,mp3后缀保存到数组
    DIR *dirp = opendir(local_music_path);
    if(dirp==NULL)
    {
        perror(local_music_path);
        exit(0);
    }
    struct dirent* msg;
    while(1)
    {
        msg = readdir(dirp);
        if(msg == NULL)break;
        if(msg->d_name[0]=='.')continue;
        if(strstr(msg->d_name,".mp3"))
        {
            sprintf(music_path[music_num], "%s/%s", local_music_path, msg->d_name);
            //拼接图片与歌词路径↓
            char name[100]={0};
            strcpy(name,strtok(msg->d_name,"."));
            sprintf(pic_path[music_num], "S:%s/%s.jpg", local_pic_path, name);
            sprintf(words_path[music_num], "%s/%s.lrc", local_words_path, name);
            //拼接图片与歌词路径↑
            music_num++;
            puts(music_path[music_num - 1]);
        }
    }
    printf("检索歌单完成 共%d\n",music_num);
}
//检索本地图片
void get_pic_path()
{
    //读目录,图片后缀保存到数组
    DIR *dirp = opendir(local_pic_path);
    if(dirp==NULL)
    {
        perror(local_pic_path);
        return;
    }
    
    struct dirent* msg;
    int pic_num=0;
    while(1)
    {
        msg = readdir(dirp);
        if(msg == NULL)break;
        if(msg->d_name[0]=='.')continue;
        if(strstr(msg->d_name,".png")||strstr(msg->d_name,".jpg"))
        {
            sprintf(pic_path[pic_num++], "S:%s/%s", local_pic_path, msg->d_name);
            puts(pic_path[pic_num - 1]);
        }
    }
    printf("检索图片完成 共%d\n",pic_num);
}
//检索歌词
void get_words_paht()
{
    //读目录,lrc后缀保存到数组
    DIR *dirp = opendir(local_words_path);
    if(dirp==NULL)
    {
        perror(local_words_path);
        return;
    }
    struct dirent* msg;
    int words_num=0;
    while(1)
    {
        msg = readdir(dirp);
        if(msg == NULL)break;
        if(msg->d_name[0]=='.')continue;
        if(strstr(msg->d_name,".lrc"))
        {
            sprintf(words_path[words_num++], "%s/%s", local_words_path, msg->d_name);
            puts(words_path[words_num - 1]);
        }
    }
    printf("检索歌词完成 共%d\n",words_num);
}

//初始化字体风格
void init_font_style()
{
    /*创建字体*/
    static lv_ft_info_t info;
    info.name = "/font/simhei.ttf";//字体位置
    info.weight = 18;//大小
    info.style = FT_FONT_STYLE_NORMAL;//风格
    info.mem = NULL;
    if(!lv_ft_font_init(&info)) {
        LV_LOG_ERROR("create failed.");
    }

    /*给字体设置样式*/
    
    lv_style_init(&font_style);
    lv_style_set_text_font(&font_style, info.font);
    lv_style_set_text_align(&font_style, LV_TEXT_ALIGN_CENTER);

    //lv_obj_add_style(label, &style, 0);
}
//初始化图片的父对象,即图片都在这个对象中显示
void init_pic_parent_obj()
{
    //在屏幕中创建一个对象
    lv_obj_t * img = lv_obj_create(lv_scr_act());
    //取消滚动
    lv_obj_clear_flag(img, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_size(img, 200, 200);
    lv_obj_align(img, LV_ALIGN_CENTER, 0, -60);
    // lv_obj_set_style_pad_all
    //图片对象
    pic_obj = lv_img_create(img);
    lv_obj_center(pic_obj);  
}
//初始化歌曲信息的父对象
void init_title_obj()
{
    //在屏幕中创建一个对象
    lv_obj_t * title = lv_obj_create(lv_scr_act());
    lv_obj_clear_flag(title, LV_OBJ_FLAG_SCROLLABLE);//禁用滚动
    lv_obj_set_size(title, 200, 50);
    lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 20);
    
    //标题标签
    title_label = lv_label_create(title);

    //添加字体
    lv_obj_add_style(title_label, &font_style, 0);
    lv_obj_center(title_label);
    lv_label_set_text(title_label, "开启音乐之旅");
    //歌词标签
    words_label = lv_label_create(lv_scr_act());
    lv_obj_add_style(words_label, &font_style, 0);
    lv_obj_align(words_label,LV_ALIGN_CENTER,0,70);
    lv_label_set_text(words_label,"歌词");
}

//信号任务
void signal_10_task(int arg)
{
    if (arg == 10)
    {
        printf("收到信号 %d 线程任务(读取mplayer)暂停\n", arg);
        pthread_kill(tid_write,12); //停止写
        pthread_c

到了这里,关于基于lvgl与mplayer音乐播放器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目《………基于android音乐播放器的设计……………………………》是本人在指导教师的指导下,进行研究工作所取得的成果。对本文的研究作出重要贡献的个人和集体,均已在文章以明确方式注

    2024年02月03日
    浏览(52)
  • 基于FPGA设计的音乐播放器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文将介绍如何使用FPGA和PCM5102音频解码模块来制作音乐播放器,从生成PCM格式的音频文件开始,到如何编写I2S总线协议代码,音频数据的储存等。 PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压

    2023年04月23日
    浏览(56)
  • 【基于Qt的在线音乐播放器】

    本在线音乐播放器的功能在于创建一个音乐播放器页面,可以实现搜索功能通过HTTP协议获取网络中数据并解析出来,播放搜索到的歌曲并展示相关信息。效果如图: Musicinterface 视图类; 主要功能:初始化窗口;设置按钮功能和窗口内容的显示; HttpHandle 网络连接类; 主要功

    2024年02月03日
    浏览(43)
  • 基于FPGA的多显示智能音乐播放器

    1.1 项目功能分析 (1)蜂鸣器歌曲播放。①选取《我和我的祖国》与《天空之城》进行预置歌曲预置,将乐曲音符转换成相应的代码,通过EDA开发平台进行乐曲定制。②编写数控分频器程序,对单一输入高频进行预置数分频,生成每个音符发音的相应频率。③计算分频预置数

    2024年02月03日
    浏览(41)
  • 基于Arduino Uno开发板制作音乐播放器

    1.Arduino开发板 Arduino Uno 是一款基于 Microchip ATmega328P 微控制器的开源微控制器板,由 Arduino.cc 开发,最初于 2010 年发布。该板配备了一组数字和模拟输入/输出 (I/O) 引脚,可以连接到各种扩展板(屏蔽)和其他电路。 该板具有 14 个数字 I/O 引脚(6 个能够进行 PWM 输出)、6 个

    2024年02月16日
    浏览(47)
  • 基于微信小程序的音乐播放器设计

    目 录 1绪论 1 1.1选题背景及意义 1 1.2发展现状 1 1.2.1什么是微信小程序 1 1.2.2小程序市场的现状 4 1.3研究主要内容 4 2系统技术 5 2.1 Java语言 5 2.2 SSM框架 6 2.3 Vue.js框架 7 2.4 Eclipse开发工具 8 2.5数据库 9 2.6系统开发环境概述 10 3系统分析 12 3.1 功能需求(用例图分析) 12 3.1.1 网络音

    2024年02月11日
    浏览(37)
  • 基于FPGA的音乐播放器硬件电路设计

    基于FPGA的音乐播放器硬件电路设计 随着嵌入式系统技术的不断发展,音乐播放器作为一种便携式设备得到了广泛的应用。本文将介绍一种基于FPGA(Field Programmable Gate Array)的音乐播放器硬件电路设计方案,该方案可以实现高质量的音频播放和文件存储功能。 系统概述 基于

    2024年02月02日
    浏览(67)
  • 基于FPGA的音乐播放器系统设计_kaic

    摘 要 音乐播放器随处可见,广播、CD、MP3、车载播放器、智能家居等系统,都用播放器娱乐着我们的生活。FPGA以硬件描述语言完成的电路设计,具有运算速度快,编程简单又稳定性,长期维护,成本等优点,本文基于FPGA实现音乐播放器设计。 本设计基于FPGA片上系统(SoC)完成

    2024年02月06日
    浏览(59)
  • 开源小项目 - 基于无源蜂鸣器实现的音乐播放器

    目录 一、音乐简谱相关知识 1、音符 2、音调 3、识读简谱 1. 找到简谱中C调的音符对应的蜂鸣器频率(确定音调对应的频率) 2. 确定蜂鸣器演奏一拍所需的时间(即确定一个音调对应的节拍数) 3.创建结构体确定一个音符所需的两个属性(音调频率、节拍数) 4.将《两只老虎

    2024年03月10日
    浏览(53)
  • ssm基于微信小程序的音乐播放器(程序+开题)

    本系统(程序 + 源码)带文档 lw 万字以上 文末可获取一份本项目的 java 源码和数据库参考。 研究背景: 随着移动互联网的普及和智能手机的广泛应用,人们对于音乐的需求也越来越高。传统的音乐播放器存在着功能单一、操作繁琐等问题,无法满足用户的需求。因此,开发

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包