关于使用 Libmad 开源库进行 MP3 音频解码的一些问题 (平头哥杯比赛)

wujian100 撷拾落英 ⋅ 于 2020-07-20 19:08:54 ⋅ 最后回复由 YX 2020-07-21 18:36:46 ⋅ 232 阅读

一、是否需要逐帧解码
目前,我们已经成功移植Libmad库至Windows系统,并实现了从一个MP3文件读取全部音频帧信息(剔除标签信息),并解码出PCM数据的功能。
然而,由于担心Wujian100的运算空间不足会导致整体读入全部MP3音频文件的操作无法完成,我们一直在研究Libmad“逐帧解码”的实现:此处的逐帧解码意为从MP3文件中依次读取数据帧中的每一帧,分别解码并立即输出。
我们也设想过通过例化硬件资源额外提供的BRAM来写入我们的MP3数据,通过指针操作来进行MP3数据的获取,但不知难度系数如何,有无实现的可能。
二、逐帧解码遇到的原理性问题
在移植Libmad基础代码并实现解码的过程中,我们始终对于其顶层部分的API进行调用和修改(因为只有这部分的代码我们能看懂);然而解码过程中我们遇到了许多问题:首先每一帧帧头的同步位必须首先读入才能实现同步;而采用VBR型的MP3的数据帧会有一部分存在这一帧之前,也就是上一帧的内容中,这对我们试图读入每一帧并解码的操作很难进行。
若必须要实现逐帧读入再解码的操作,我们需要对Libmad的哪一部分进行修改呢?

成为第一个点赞的人吧 :bowtie:
回复数量: 4
  • YX MOD
    2020-07-21 12:23:47

    1)或许可以尝试下开个FIFO,把数据丢进去让wujian100进行处理.
    2)似乎可以用流水线的方式来处理,读2帧,解码1帧。

  • 撷拾落英
    2020-07-21 18:23:49

    Libmad相关问题追问
    现象:

    1.代码在电脑中运行正常

    2.在仿真过程中,如果我们自己定义一个char变量( fdm ),无论malloc(5)或者malloc( sizeof(decoder -> sync ) ) 都可以成功执行。

    3.在仿真过程中,如果将malloc()生成的指针赋值给结构体就会失败。(会卡在malloc语句,直到仿真结束,也就是图1中的后两个malloc()语句无法成功执行)

    下面给出代码和运行结果的截图:

    Ps: 仿真不会报错,仿真会一直卡在第二个malloc()语句,直到达到仿真时间上限。

    file

    图1. Malloc()的代码

    file

    图2. 运行结果

  • 撷拾落英
    2020-07-21 18:27:54

    @YX 谢谢管理员!请问可以再看一下楼下的问题吗?我们好像仿真时在使用动态内存分配上遇到了一些问题。

  • YX MOD
    2020-07-21 18:36:46

    @撷拾落英
    结构体中的malloc 与 free
    这篇文章或许对你的问题有用~

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter