问题标签 [id3v2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
663 浏览

flash - 如何确定图像埋藏在 ID3v2 标记中的哪个位置?

我正在尝试从 mp3 中加载 jpg(我在 Flash 中执行此操作,但这既不是这里也不是那里),我已经在十六进制编辑器中打开了一些 MP3,而标签的其余部分是很清楚,图像部分是一个谜。有一个标签“image/jpeg”,但随后我期望图像的字节长度或用于划分图像结尾的字符串键,但我什么也没看到,标签上的文档完全没有帮助。

希望得到一些关于我在这里寻找的指导。惊讶于结果是多么不直观!

TIA

0 投票
1 回答
468 浏览

php - 针对 mp3 文件中的 ID3v2 不同步方案的正则表达式?

我正在创建一段代码来检查我服务器上的 mp3 文件并获得结果,其中一些是否有错误同步。简而言之,我使用fread()函数在 PHP 中加载这些文件并获取变量中的流。在拆分该流以获得 id3v1 (不是必需的,它不是同步的主题)、id3v2 (主要问题)和音频的单独流之后,我必须针对 id3v2 流实现该方案。

根据ID3v2 官方文档

“非同步方案”的唯一目的是使 ID3v2 标签尽可能与现有软件兼容。如果文件仅由新软件处理,则“不同步”标签没有用处。只能对 MPEG 2 层 I、II 和 III 以及 MPEG 2.5 文件进行不同步。

只要在标签中发现错误同步,就会在第一个错误同步字节之后插入一个零字节。ID3 编码器应更改的正确同步格式如下:

%11111111 111xxxxx

并且应该替换为:

%11111111 00000000 111xxxx

这具有必须更改所有 $FF 00 组合的副作用,因此它们不会受到解码过程的影响。因此,在不同步期间,所有 $FF 00 组合都必须替换为 $FF 00 00 组合。

为了指示不同步的使用,应该设置“ID3 flags”中的第一位(注意:我找到了那个位)。仅当标签包含现已更正的错误同步时,才应设置该位。仅当标签不包含任何错误同步时,该位才应被清除。

请记住,如果编码器使用压缩方案,则应在之后应用非同步方案。解码压缩的“未同步”文件时,应首先解析“未同步方案”,然后解压缩。

我的问题是:

  1. 如何搜索和替换这个位%11111111 111xxxxx模式%11111111 00000000 111xxxxx
  2. 反之亦然,如何搜索和替换这个位%11111111 00000000 111xxxxx模式%11111111 111xxxxx

...使用preg_replace()

到目前为止,我创建的代码运行良好,而且我只多了一行(嗯,正好两行)。

如何使用 preg_replace() 函数使这两行起作用?

PS我知道如何在某种循环中逐个字节地读取它,但我确信这可以使用正则表达式(顺便说一句,老实说,我很喜欢正则表达式)。

如果您需要更多详细信息,请告诉我。


还有一件事...

目前我正在使用这种模式

切断从第一个零字节开始直到结束的部分字符串。这是这样做的正确方法吗?


更新

@mario 的回答)。

在前几次测试中……这段代码返回了正确的结果。

但是几分钟后,我发现了一个特定的情况,即一切看起来都像预期的结果,但流中仍然有 FFE0+ 对。

如果流包含类似的FF FF FF FF内容,它将被替换为FF 00 FF FF 00 FF,但它应该是FF 00 FF 00 FF 00 FF。该FF FF对将再次错误 mp3 同步,因此我的任务是避免FFE0+音频流之前的每个模式(在 ID3v2 标记流中;因为 mp3 以FFE0+字节对开头,它应该首先出现在音频数据的开头)。我发现我可以循环相同的正则表达式,直到我得到没有 FFE0+ 字节对的流。有没有不需要循环的解决方案?

干得好@mario,非常感谢!

0 投票
3 回答
359 浏览

c - 如何获得 ID3v2 标头的必要值?

我正在尝试读取 mp3 文件的 ID3V2 标头。我可以获取/打印 ID3 并想打印出 char 类型的“版本”和“颠覆”,但我无法得到我需要的东西。

这是代码:

一个。

0 投票
2 回答
840 浏览

c# - 解码长 ID3V2 帧

因此,我正在编写一个有趣的程序来收集存储在 ID3 标签中的 MP3 信息。(ID3v1 是微不足道的,这很麻烦!)

我使用的一般过程是读取 FrameID(4 个字节),然后是 Length(4 个字节),然后是 Data(Length Bytes)。

读取 Length 时,它是一个 Syncsafe 整数,所以本质上每个字节中的最高位应该是 0。这对于小数据帧来说似乎很好,但是当它们变长时,偶尔我会遇到长度中的一个字节最高位为 1 的字段。按照 ID3 规范的约定,我应该忽略此位,但这样做会导致算法搞砸,只能得到部分标签。

特别是标签的frhed转储:

此时,长度是$00 00 00 c6,作为 BigEndian int 是198,这在技术上是这里标签的长度。但是,二进制的c611000110。同步安全算法核对了第一位,然后计数变为70,这是不正确的。我已经让 Winamp 2.95 和 iTunes 10 用帧长度来做到这一点。我不明白。是否存在我应该寻找同步安全整数的条件,或者在阅读这些帧时保持原样?

源代码:

运行此示例后 i 和 j 的值分别为 198 和 70。

这是完整的标头(fhed 转储,它稍微进入 MP3 标头的开头):

0 投票
1 回答
2286 浏览

c - 如何读取 id3v2 的帧?

我正在尝试阅读 id3 帧,但我的问题是我无法获得完整的标题。当 mp3 的标题很长时,我的结果是没有结尾且没有前 9 个字符的字符串。如果歌曲的标题很短,我的结果是没有前 9 个字符的标题。

0 投票
0 回答
1178 浏览

java - 使用 jid3lib 将 Unicode 读/写到 ID3v2

我正在尝试使用 jid3lib 编写一个应用程序,并且在读/写 id3v1 方面几乎所有东西都可以工作,但是对于 v2 unicode,我无法找出将 unicode 转换为可用字符串然后重新编码的最佳操作过程写回框架。

我找到了 CharsetDecoder 和 CharsetEncoder 但它们似乎没有改变任何东西。

其中 convertCharset 是:

输出如下:http: //i.stack.imgur.com/RLbKe.png

非常感谢您的帮助。

0 投票
2 回答
604 浏览

windows-phone-7 - 覆盖 Windows Phone 7 中音频文件的元数据

我很想为我的音乐播放器提供一个修复元数据功能,但据我所知,没有库可以做到这一点。但是我发现一些 C# 应用程序可以做到这一点。

例子

我需要一些建议,并且可能是一个很好的资源来开始这个项目。任何帮助将不胜感激。

谢谢。

编辑:我也发现了这个,这与我想做的非常相似,但是来源很少。 http://wmpoweruser.com/finally-mp3-tag-editor-for-windows-mobile-available/

0 投票
1 回答
1192 浏览

php - PHP将变量更改为jpeg文件

我有以下代码使用 getid3 获取 mp3 的专辑封面,但问题是,如何复制此图像并将其放入指定目录?

这可能吗,如果是的话怎么办?谢谢你的帮助 :)

0 投票
1 回答
663 浏览

mp3 - 使用 TagLib 从 MP3 文件中提取 GUID

所以,我的最终游戏是从我的音频文件中获取专辑封面。我正在使用 taglib 和 c++。我找到了有关如何提取嵌入图像数据的信息,但似乎 windows 媒体播放器没有嵌入图像本身。相反,它会保存一个名为 AlbumArt_{E3208100-4FAA-4030-BB9D-6DA5F9D93D18}_Large.jpg 之类的 jpg。显然它使用的是 guid,我相信它保存在 PRIV 标签中。我对你们的问题是我怎么能得到它?我认为这样的事情可能会奏效:

但数据似乎没有任何用处。有任何想法吗?

0 投票
1 回答
1032 浏览

c++ - 为什么同步安全整数?

我最近正在研究 ID3v2.4.0。阅读 2.4.0 文档,我发现了一个我无法理解的特定部分 - 同步安全整数。ID3v2为什么要用这种方式?

当然,我知道为什么 ID3v2 使用非同步方案,该方案用于防止 MPEG 解码器将 ID3 标签视为 MPEG 同步数据。但我无法理解的是,为什么同步安全整数而不是非同步方案(= 插入 00 美元)。

在表达标签大小而不是插入 $00 时,他们有什么理由采用同步安全整数?这两种方法产生完全相同的效果。 

ID3v2 文档说未同步数据的大小是事先不知道的。但这种说法没有意义。如果标记数据存储在缓冲区中,只需将有问题的字符替换为 $FF 00 即可知道未同步数据的大小。

有谁能帮助我吗?