c++ - ADTF 录音文件格式
问题描述
我正在用 C++ 编写一个 ADTF 录音文件阅读器。我已经使用此处指定的结构阅读了标题 https://support.digitalwerk.net/adtf_libraries/adtf-streaming-library/v2/DATFileFormatSpecification.pdf
typedef struct tagFileHeader {
int ui32FileId;
int ui32VersionId;
int ui32Flags;
int ui32ExtensionCount;
long long ui64ExtensionOffset;
long long ui64DataOffset;
long long ui64DataSize;
long long ui64ChunkCount;
long long ui64MaxChunkSize;
long long ui64Duration;
long long ui64FileTime;
char ui8HeaderByteOrder;
long long ui64TimeOffset;
char ui8PatchNumber;
char _reserved[54];
char strDescription[1912];
} tFileHeader; // size is 2048 Bytes
我读了heder
ifstream file("myfile.dat", std::ifstream::binary);
char buffer[2048];
file.read(buffer, 2048);
const tagFileHeader* header = reinterpret_cast<const tagFileHeader*>(buffer);
现在我需要阅读这些块。这是从同一个文档中提取的块头
typedef struct tagChunkHeader {
long long ui64TimeStamp;
int ui32RefMasterTableIndex;
int ui32OffsetToLast;
int ui32Size;
short ui16StreamId;
short ui16Flags;
long long ui64StreamIndex;
} tChunkHeader; // size is 32 Bytes
读取块
for (int c = 0; c < header->ui64ChunkCount; ++c)
{
char chunkHeaderBuffer[32];
file.read(chunkHeaderBuffer, 32);
const tChunkHeader* chunk = reinterpret_cast<const tChunkHeader*>(chunkHeaderBuffer);
//Skeep chunk data
file.seekg(chunk->ui32Size, ios_base::cur);
}
我不知道如何解释块数据。这是在我丢失的另一个文件中指定的吗?谢谢
解决方案
为了完整起见:
块数据布局取决于原始样本数据和使用的序列化。所以没有一个单一的数据布局。您必须使用正确的反序列化实现来反序列化块数据,然后才能使用正确的结构定义解释反序列化的数据。有关使用的序列化的信息存储在流的索引扩展中。
正如 C-3PFLO 已经说明的那样,adtf_file 库会为您完成所有这些工作,但您需要所有必需的反序列化器插件。
推荐阅读
- c# - VS 2019 Metadata Not Found and Value Can't be Null 错误
- python - 如何在管道中获取 TfidfVectorizer?连接轴不匹配
- guacamole - 用户空闲时的鳄梨酱断开会话
- python - Python中不支持的操作数但定义了重载的运算符
- python - 单元测试是否适用于 Python 中的功能性(非面向对象)程序?
- css - Angular 10 - 添加自定义 css url 的最佳方式?
- linux - 使用“gcc $(pkg-config --cflags --libs glib-2.0) context.c”编译时出错->
未找到 - javascript - 反应本机位置开关
- python - 尝试通过 spotipy 库(Spotify Web API)控制另一台设备上的播放时出现错误 403
- node.js - Node.js.json 失败