获取MP3、WAV文件时长简易方案

最近在使用ESP32-S3开发SD卡播放本地歌曲,使用官方组件espressif/esp_audio_simple_player,但是无法获取文件播放时长,在网上也没有找到简单、准确的偷懒方法,自己也没时间去摸索底层原理,这里使用tinymp3库提供一个简单的参考做法。

1、WAV

创建一个main_wav.c,拷贝下面代码。

/*main_wav.c*/
#define DR_WAV_IMPLEMENTATION
#define DR_WAV_NO_CONVERSION_API   /* 去掉所有 drwav_read_*_s16/f32/s32 */
#define DR_WAV_NO_STDIO            /* 去掉 drwav_init_file/write 等 */
#include "dr_wav.h"                

#include <stdio.h>
#include <stdlib.h>

static size_t file_read(void *ud, void *buf, size_t len)
{
    return fread(buf, 1, len, (FILE*)ud);
}
static drwav_bool32 file_seek(void *ud, int offset, drwav_seek_origin origin)
{
    return fseek((FILE*)ud, offset, origin==drwav_seek_origin_start?SEEK_SET:SEEK_CUR)==0;
}

int main(int argc, char *argv[])
{
    if(argc!=2){ fprintf(stderr,"usage: %s file.wav\n",argv[0]); return 1; }
    FILE *fp = fopen(argv[1],"rb");
    if(!fp){ perror("fopen"); return 1; }

    drwav wav;
    if(!drwav_init(&wav, file_read, file_seek, fp, NULL)){ fclose(fp); return 1; }

    double dur = (double)wav.totalPCMFrameCount / wav.sampleRate;
    printf("%.3f\n", dur);          /* 只打印秒数 */
    drwav_uninit(&wav);
    fclose(fp);
    return 0;
}

把库文件dr_wav.h放到同级别目录下,编译运行,即可得到wav文件总时长。
在这里插入图片描述

2、mp3

同wav操作。

/*main_mp3*/
#define DR_MP3_IMPLEMENTATION
#define DR_MP3_NO_SIMD               /* 不要 SSE/Neon 加速(省体积) */
#define DR_MP3_ONLY_MP3              /* 只支持 MP3,去掉 Layer1/2 代码 */
#include "dr_mp3.h"
#include <stdio.h>

int main(int argc, char **argv)
{
    if (argc != 2) return 1;

    drmp3 mp3;
    if (!drmp3_init_file(&mp3, argv[1], NULL))   /* 内部仍用 fopen */
        return printf("invalid mp3\n"), 1;

    drmp3_uint64 frames = drmp3_get_pcm_frame_count(&mp3);
    double sec = (double)frames / mp3.sampleRate;
    printf("%.3f\n", sec);

    drmp3_uninit(&mp3);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值