歌曲播放器作业(简易&终端版)

隔壁老王
• 阅读 98

1. 前期准备

ubuntu系统 myplayer 单向链表 mp3歌曲 与歌曲对应的lrc歌词文件

注意:系统安装请自行查阅。本项目使用C语言开发

安装解码器

sudo apt-get install mplayer

krc转lrc文件转换器可在源码库中查找

定义存放歌词的结构体, 根据结构体创建链表操作函数 lrc.h

#ifndef __LRC_H__
#define __LRC_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
typedef struct
{
    // 表示日期时间的数据结构
    char minute;
    char second;
} TIME;

typedef struct lrc
{
    int time;          // 歌词时间点
    char lrc_buf[200]; // 歌词内容
    int lrc_cur_num;   // 第几句歌词
    struct lrc *next;  // 指向链表中的下一个节点
} LRC;
extern char *read_src_file(char *file_name);                             // 读取文件内容
extern int strtok_lrc_buf(char *src, char ***dest);                      // 切割文件内容
extern LRC *lrc_head_resolve(char ***data, int *len);                    // 处理前几行数据 生成链表头
extern LRC *lrc_resolve(char ***data, int head_len, int len, LRC *head); // 处理头之外的数据
extern void print_song_head(LRC *head, int head_len);                    // 打印歌曲头信息
extern void lrc_printf(LRC *start_point, LRC *pb, int head_len);         // 打印歌词
extern LRC *link_search(LRC *head, int m_time);                          // 查找节点位置
extern LRC *insert_double_link(LRC *head, LRC src);                      // 有序插入链表
extern void link_free(LRC *head);                                        // 释放链表
extern void time_printf(TIME tm, int head_len);                          // 打印时间
extern void m_clock(TIME *p_m_time);                                     // 计算时间
extern void print_space(TIME m_time, int head_len);                      // 打印进度条
#endif                                                                   // !__LRC_H__

项目使用makefile进行编译工作

CC=gcc
TARGET=main # 主程序
OBJ=main.o lrc.o tools.o my_player.o
CFLAGS=-Wall

$(TARGET):$(OBJ)
    @$(CC) $^ -o $@
    @./$(TARGET)

$.o:$.c
    @$(CC) -c $< -o $@

.PHONY:clean

clean:
    rm $(TARGET) $(OBJ)

参考答案讲解:

  1. 功能(歌曲播放、歌曲信息显示、时钟显示变化、歌词滚动显示、歌词高亮)
  2. 分析源码(先整体后部分)
  3. 1 目录结构: ./lrc 歌词文件 ./tools 光标定位及颜色的c文件 ./song 歌曲文件 Makefile 编译规则 main.c 主文件 lrc.c/lrc.h 分文件歌词处理
  • my_player.c/my_player.h 分文件播放歌曲

2.2 Makefile 编译规则:

  • 明确main.c my_player.c ....参与编译

2.3 main.c

main函数
开始:
read_src_file读出歌词文件内容并保存到返回值
---->strtok_lrc_buf将读出歌词文件内容切割成一行一行并保存到指针数组,返回值为行数。
---- >lrc _head_resolve处理前四行歌词
[ti:简单爱]------>简单爱(song_msg[0])
[ar:周杰伦]------>周杰伦(song _msg[1])
[al:范特西]------>范特西(song_msg[2])
[by:大脸猫]------>大脸猫(song_msg[3])
----->lrc_resolve处理带时间的歌词
[00:04.41]周杰伦Chow,Jay Jou---->双向链表中的一个节点
[02:04.94][00:36.09]我想大声宣布对你依依不舍----》双向链表中的两个节点
---》free回收使用完的内存。
---》print_song _message打印前四行歌词
---》time_printf打印时间
---》Irc_printf打印前五句歌词,无高亮
----》mplayer_play播放歌曲
循环:
时钟每隔1s+1并显现
find_start_point和lrc_printf保证了歌词一直显示5行,且第一个参数是5行的起始节点,第二个高亮的节点
清理:
link_free(head);//释放链表
song_msg_free(song_msg);//释放歌曲信息
cusor_show();//显示光标

源码路径 https://gitee.com/YiZhiLuGuoDeXiaoMaNong/terminal-song-playback

效果截图 歌曲播放器作业(简易&终端版)

点赞
收藏
评论区
推荐文章
Aidan075 Aidan075
3年前
收藏这些API,获取网易云音乐数据超轻松
汇总了常见的网易云音乐API,墙裂建议点击右上角收藏下面是常见的网易云音乐get请求的API。简单介绍一下它们:评论http://music.163.com/api/v1/resource/comments/RSO4歌曲ID?limit20&offset0这应该是最最最常见的了,毕竟80%的网易云音乐的爬虫/数据分析文章都是关于评论数据使用技
Aidan075 Aidan075
3年前
收藏这些API,获取网易云音乐数据超轻松
汇总了常见的网易云音乐API,墙裂建议点击右上角收藏下面是常见的网易云音乐get请求的API。简单介绍一下它们:评论http://music.163.com/api/v1/resource/comments/R_SO_4_{歌曲ID}?limit20&offset0这应该是最最最常见的了,毕竟80%
虾米大王 虾米大王
1年前
java代码052
code052.jsp简易的电子时钟clockwidth:420px;height:80px;backgroundcolor:e0e0e0;fontsize:25px;fontweight:bold;border:5pxsolidorange;padding:20px;weekpaddingtop:15px;color:0080ff;
Stella981 Stella981
2年前
Android音乐播放器开发(6)—歌曲播放列表
1\.说明本文很早就开始写了,不过中间把电脑借给小伙伴了,后来就忘了这件事了…内容已同步到Gitee仓库(https://gitee.com/Sjcun/androidMusicPlayer)以往的文章服务端:Android音乐播放器开发–服务端(https://www.oschina.net/action/
Wesley13 Wesley13
2年前
VScode开源音乐插件
VSCNeteaseMusic是国人开发的VScode开源的音乐插件。遵守MIT开源协议。使用网易音乐的API,基于Webview实现,通过HTMLAudioElement播放音乐,不依赖命令行播放器,在vscode上划水听音乐。!(https://oscimg.oschina.net/oscnet/3633354c5972db931f
Wesley13 Wesley13
2年前
Ubuntu 下安装深度音乐播放器
网上搜了一个安装深度音乐的有问题。我自己又整理一个最新的2014版的深度音乐。Linux环境:Ubuntu14.04LTS64bit深度音乐都是DEB包安装。下面,介绍如何安装深度音乐播放器。需要pythondeepinutils、deepinui、gstreamer0.10ffmpeg、pythondeeping
Wesley13 Wesley13
2年前
20款可嵌入网站和博客的免费音频播放器
本文将给您提供一些免费的在线音频播放器,在线音频播放器允许任何人在他们的站点和博客上添加,比如常见的音乐网站及其他个性的网站中。在这篇文章中,我已编制了20个免费为您的网站和博客提供的音频播放器,希望能帮助你节省时间找到适合你的一个。1\.ZanorgPlayer如果你正为你的站点或博客寻找一些简易的能播放一个单一文件的MP3播
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
达里尔 达里尔
7个月前
给数组添加新数据,判断数据是否重复
多选要进行数组拼接,希望判断往原数组里添的新数据是否重复,封装个简易方法languageconstdataArrayname:'aaa',id:1,name:'bbb',id:2;constnewDataname:'ccc',id:2;//要添加的新数
隔壁老王 隔壁老王
2个月前
QT-LINUX简易版mp3播放器(设计阶段)
在ubuntu下使用qt和mplayer开发的简易音乐播放器
隔壁老王
隔壁老王
Lv1
千万程序员队伍中的一员。我住隔壁我姓王,同事们亲切得称呼我隔壁老王
文章
20
粉丝
2
获赞
7