浅析LRC歌词文件

本文详细介绍了LRC歌词文件的三种格式:简装版、扩展简装版和增强版,以及如何在ffplay中通过filter渲染歌词。LRC文件常用于数码播放器同步显示歌词,其时间标签与歌词内容结合实现与音频同步。ffplay通过subtitles filter支持歌词显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[时间:2018-12] [状态:Open]
[关键词:字幕,LRC,歌词,lyric,文件格式]

0 引言

几年前(2010年左右),网络音乐流行与免费的时代,网上有大量的mp3,使用比较常见的播放器,比如酷狗、酷我、千千静听等,下载mp3时总会附带下载一个同名但以lrc为后缀的文本文件,在早几年你可能还会遇到当时iPod的前身mp3播放器。这个lrc文件的格式就是本文的主题。

lrc是英文lyric(歌词)的缩写,被用做歌词文件的扩展名。以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示。大部分MP3显示歌词的方法使用的是lrc格式的歌词文件,也是当前网络上最流行的一种歌词格式。

本文的主要内容将包括:

  1. LRC文件格式
  2. 音乐播放器之歌词播放
  3. ffplay中渲染歌词

1 LRC文件格式

LRC文件是一种基于文本的格式,和外挂的字幕流(subtitle)类似。通常有三种格式:

1.1 简装版

这是最常见的一种LRC格式。该格式通常显示一整行歌词。
LRC中有两类元素:一种是时间标签+歌词,一种是ID标签。
时间标签的格式是[mm:ss.xx],其中mm是分钟数,ss是秒数,xx是10ms数(注意这里都是两位数,超出可能会被认为是格式错误)。
我们在很多歌词文件中看到的格式如下:

[00:25.44]自从你离开我
[00:31.14]我不知道这些心里话还能向谁说
[00:40.12]就像是童话 王国里走来的人
[00:47.80]在我的世界 悄悄的走近又悄悄的走远
[01:02.81]你是黑暗之中唯一的星光

ID标签通常出现在歌词行之前,有些播放器会忽略ID标签,不做任何解析。通常的支持的

STM32启动文件是嵌入式开发中非常关键的一部分,它负责在芯片上电或复位后进行初始设置,并跳转到主程序的入口点。该文件通常以汇编语言编写,其功能包括初始化堆栈指针、中断向量表配置、系统时钟设置以及调用C库函数的初始化代码等。 ### 启动文件的主要功能 1. **设置初始堆栈指针** 在芯片上电后,首先需要设置堆栈指针(SP),这是因为在后续的初始化和程序运行过程中会使用到堆栈来保存局部变量、函数调用返回地址等信息。启动文件通过一条指令将一个预定义的地址赋值给堆栈指针寄存器。 2. **定义中断向量表** STM32微控制器支持多种中断源,因此启动文件必须定义中断向量表,其中包括各种异常处理程序和外设中断服务例程的入口地址。例如,复位中断(Reset_Handler)是第一个被执行的处理程序,它负责引导整个系统的初始化过程[^1]。 3. **调用系统初始化函数** 复位处理程序通常会调用`SystemInit()`函数,这个函数用于配置系统时钟(如PLL设置)、AHB/APB总线时钟分频系数等关键参数,确保MCU运行在正确的频率下。 4. **跳转到主程序入口(main函数)** 完成底层硬件初始化之后,启动文件中的代码会调用`main()`函数,从而进入用户应用程序的执行阶段。在此之前,可能还会涉及到`.data`段和`.bss`段的初始化,即把已初始化的数据从Flash复制到RAM中,并将未初始化的数据区域清零[^1]。 5. **提供默认的中断处理程序** 如果某些中断没有被用户显式地实现,则启动文件可以提供一些弱定义(weak symbols)的默认处理程序,防止程序因找不到中断服务例程而崩溃。 6. **支持调试接口配置** 有些启动文件还包含对调试接口(如SWD或JTAG)的支持,以便于开发者进行在线调试。 ### 启动文件的基本结构示例 以下是一个简化的STM32启动文件片段,展示了基本的中断向量表和复位处理程序: ```assembly ; 文件名:startup_stm32f10x_hd.s .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack ; Initial Stack Pointer .word Reset_Handler ; Reset Handler .word NMI_Handler ; NMI Handler .word HardFault_Handler ; Hard Fault Handler .word MemManage_Handler ; MPU Fault Handler ... .thumb_func .type Reset_Handler, %function Reset_Handler: bl SystemInit ; Call SystemInit before main ldr r0, =_start ; Set the initial PC to main bx r0 ; Branch to main ``` 在这个例子中,`_estack`表示堆栈的起始地址,而`Reset_Handler`则是复位中断的处理程序,它调用了`SystemInit()`并最终跳转到`main()`函数开始执行用户代码。 ### 相关问题 1. STM32启动文件如何影响系统的时钟配置? 2. 如何修改STM32的启动文件以适应不同的硬件平台? 3. 在STM32项目中,为什么需要对.data和.bss段进行初始化? 4. 不同系列的STM32芯片之间启动文件有何差异? 5. 调试STM32应用时,启动文件中的哪些部分可能会导致问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值