首页 > 解决方案 > 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++adtf

解决方案


为了完整起见:

块数据布局取决于原始样本数据和使用的序列化。所以没有一个单一的数据布局。您必须使用正确的反序列化实现来反序列化块数据,然后才能使用正确的结构定义解释反序列化的数据。有关使用的序列化的信息存储在流的索引扩展中。

正如 C-3PFLO 已经说明的那样,adtf_file 库会为您完成所有这些工作,但您需要所有必需的反序列化器插件。


推荐阅读