c++ - 为什么我收到错误臀部:比特流问题,在播放 mp3 歌曲时重新同步跳过?
问题描述
我收到了比特流问题的错误。我已经跳过了 512 个字节的 id3tag 读取,但是在播放某些歌曲时我仍然无法播放所有歌曲
define MP3_SKIP_SIZE 512
fseek(playerDetails->mp3Fp,MP3_SKIP_SIZE,SEEK_SET);
解决方案
ID3 标签的大小是可变的,不一定是 512 字节。
您可以使用id3lib找出 ID3 标签的大小:
#include <id3/tag.h>
// Get size of ID3 tags
size_t getID3TagSize(const char* filename)
{
ID3_Tag myTag(filename);
return myTag.Size();
}
#include <lame.h>
void decodeMp3(const char* fileName)
{
size_t mp3TagSize = getID3TagSize(fileName);
f.open(fileName, std::ios::binary);
f.seekg(mp3TagSize); //Skip ID3 tags
std::array<unsigned char, 1024*1024> buffer;
f.read(reinterpret_cast<char*>(&buffer[0]), buffer.size());
auto count = f.gcount();
hip_t lameInput = hip_decode_init();
mp3data_struct mp3data{ 0 };
std::array<short, 1024 * 1024 * 8> pcm_l;
std::array<short, 1024 * 1024 * 8> pcm_r;
int decodeResult = hip_decode_headers(lameInput, &buffer[0], count, &pcm_l[0], &pcm_r[0], &mp3data);
//... Continue decoding ...
}
推荐阅读
- python - 如何提高在 python 中使用循环处理 numpy 数组的计算效率?
- python - Python 简单 spyne SOAP web 服务响应慢
- loops - 如何在 julia 中使用数组元素作为迭代器?
- android - 如何将 AnyChart-Android 导入 Android Studio
- c# - 在文本框中自动显示值
- powershell - 在不同域之间复制数据
- batch-file - 批量“for”命令从 TSV 文件中提取列
- session - pine 脚本 v4:会话范围问题
- c++ - Z3:如何在不使用硬编码索引的情况下从 model() 访问变量?
- android - DefaultNetworkCallback 用于检查网络连接未成功更新全局状态变量