为什么 libFLAC 的 FLAC__metadata_get_tags 函数不是确定性的?
Why is the FLAC__metadata_get_tags function of libFLAC not deterministic?
在尝试使用 libFLAC 的同时,我尝试使用此 C 程序的 FLAC__metadata_get_tags
函数:
#include <stdio.h>
#include <FLAC/metadata.h>
int main() {
FLAC__StreamMetadata* metas;
if (FLAC__metadata_get_tags("/tmp/test.flac", &metas) && metas != NULL) {
for (int i = 0;; i++) {
printf("type: %d, length: %d\n", (metas+i)->type, (metas+i)->length);
if ((metas+i)->is_last) {
break;
}
}
FLAC__metadata_object_delete(metas);
}
}
当多次运行这个程序时,我得到不同的输出。似乎有不同数量的类型为 0 (FLAC__METADATA_TYPE_STREAMINFO
) 的元数据条目。有时我什至会得到未定义的类型和负长度。
这是为什么?我希望该程序始终提供相同的输出。我也不确定长度为 0 甚至负长度的元数据条目应该是什么意思。
这是一个执行示例:
$ clang -I/usr/local/include -L/usr/local/lib -lFLAC -logg test.c && ./a.out
type: 4, length: 213
type: 0, length: 0
type: 0, length: 0
type: 11, length: 1083592000
type: -538976289, length: 0
FLAC__StreamMetadata
不是元数据列表,是一个元数据,只填TYPE_VORBIS_COMMENT
我找到了如何迭代它的代码,来自 https://isrc.iscas.ac.cn/gitlab/mirrors/github.com/musicplayerdaemon_mpd/-/blob/6419cc54ac200b217d99ee35d1e2d57dbfda3f55/src/decoder/flac_plugin.c :
#include <stdio.h>
#include <FLAC/metadata.h>
int main() {
FLAC__StreamMetadata* metas;
if (FLAC__metadata_get_tags("./test.flac", &metas) && metas != NULL) {
for (unsigned i = 0; i < metas->data.vorbis_comment.num_comments; i++) {
char *ptr;
if ((ptr = (char*)metas->data.vorbis_comment.comments[i].entry) != NULL) {
printf("%s\n", ptr);
}
}
FLAC__metadata_object_delete(metas);
}
}
从 https://helpguide.sony.net/high-res/sample1/v1/en/index.html 下载的 .flac 输出:
ALBUM=Bee Moved
TITLE=Bee Moved
ALBUMARTIST=Blue Monday FM
MRAT=0
ARTIST=Blue Monday FM
总体而言,当有疑问时 - 当项目 open-source 时,请检查来源。
在尝试使用 libFLAC 的同时,我尝试使用此 C 程序的 FLAC__metadata_get_tags
函数:
#include <stdio.h>
#include <FLAC/metadata.h>
int main() {
FLAC__StreamMetadata* metas;
if (FLAC__metadata_get_tags("/tmp/test.flac", &metas) && metas != NULL) {
for (int i = 0;; i++) {
printf("type: %d, length: %d\n", (metas+i)->type, (metas+i)->length);
if ((metas+i)->is_last) {
break;
}
}
FLAC__metadata_object_delete(metas);
}
}
当多次运行这个程序时,我得到不同的输出。似乎有不同数量的类型为 0 (FLAC__METADATA_TYPE_STREAMINFO
) 的元数据条目。有时我什至会得到未定义的类型和负长度。
这是为什么?我希望该程序始终提供相同的输出。我也不确定长度为 0 甚至负长度的元数据条目应该是什么意思。
这是一个执行示例:
$ clang -I/usr/local/include -L/usr/local/lib -lFLAC -logg test.c && ./a.out
type: 4, length: 213
type: 0, length: 0
type: 0, length: 0
type: 11, length: 1083592000
type: -538976289, length: 0
FLAC__StreamMetadata
不是元数据列表,是一个元数据,只填TYPE_VORBIS_COMMENT
我找到了如何迭代它的代码,来自 https://isrc.iscas.ac.cn/gitlab/mirrors/github.com/musicplayerdaemon_mpd/-/blob/6419cc54ac200b217d99ee35d1e2d57dbfda3f55/src/decoder/flac_plugin.c :
#include <stdio.h>
#include <FLAC/metadata.h>
int main() {
FLAC__StreamMetadata* metas;
if (FLAC__metadata_get_tags("./test.flac", &metas) && metas != NULL) {
for (unsigned i = 0; i < metas->data.vorbis_comment.num_comments; i++) {
char *ptr;
if ((ptr = (char*)metas->data.vorbis_comment.comments[i].entry) != NULL) {
printf("%s\n", ptr);
}
}
FLAC__metadata_object_delete(metas);
}
}
从 https://helpguide.sony.net/high-res/sample1/v1/en/index.html 下载的 .flac 输出:
ALBUM=Bee Moved
TITLE=Bee Moved
ALBUMARTIST=Blue Monday FM
MRAT=0
ARTIST=Blue Monday FM
总体而言,当有疑问时 - 当项目 open-source 时,请检查来源。