在涉足 libFLAC 時,我嘗試了FLAC__metadata_get_tags這個 C 程式的功能:
#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
uj5u.com熱心網友回復:
FLAC__StreamMetadata不是元資料串列,它是一個元資料,并且只有一個TYPE_VORBIS_COMMENT被填充。
https://github.com/xiph/flac/blob/27c615706cedd252a206dd77e3910dfa395dcc49/src/libFLAC/metadata_iterators.c#L217
我找到了如何迭代它的代碼,來自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
總的來說,當有疑問時——當專案是開源的時,檢查源代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442968.html
