簡體   English   中英

在 MP3 中創建 Xing 或 Info 標簽時,我可以使用任何 MP3 header 還是必須匹配其他幀?

[英]When creating a Xing or Info tag in an MP3, may I use any MP3 header or does it have to match other frames?

我有一組MP3 文件。 我從這些文件中刪除了所有標簽(沒有 ID3、沒有 Xing、沒有 Info)。

就在將這些文件之一發送到客戶端之前,我想添加一個 Info 標記。 我所有的文件都是 CBR,所以我們將使用 Info 標簽(沒有 Xing)。

現在我獲取現有 MP3 的前 4 個字節來獲取版本(MPEG-1、Layer III)、比特率、頻率、立體聲模式等,從而確定一幀的大小。 我以這種方式創建標簽,將這 4 個字節重新用於 Info 標簽並確定幀的大小。

對於那些想知道的人,這 4 個字節可能如下所示:

FF FB 78 04

對我來說,您應該在 Info 標簽中使用與 MP3 的其他音頻幀中完全相同的前 4 個字節,但是當使用 ffmpeg 時,他們會粘貼一個帶有硬編碼header 的 Info 標簽(錯誤的比特率,頻率錯誤等)

我的問題是:ffmpeg 真的做得對嗎? (LAME 不這樣做)我可以做同樣的事情,跳過前 4 個字節的加載,並且仍然有更多的播放器按預期播放我的文件嗎?

注意:由於我通過網絡讀取這 4 個字節,因此不必在HEAD請求中加載這 4 個字節肯定會節省大量時間和一些帶寬。 我可以用於GET請求的資源......

產生差異的原因是在某些配置下,幀的大小小於 192 字節。 在這種情況下,完整的 Info/Xing 標簽將不適合(據我所知,始終包含四個可選字段,因此即使不需要,Info/Xing 標簽也始終是完整的)。

因此,例如,如果您有一個 44.1kHz 數據、32kbps 的單通道,則 MP3 幀為 117 或 118 字節。 這比保存 Info/Xing 標簽所需的要少。

LAME 在這種情況下所做的就是放棄 Info/Xing 標簽。 它不會在文件中的任何地方看到。

另一方面,FFMPEG 所做的是創建具有更高比特率的幀。 因此,它將嘗試使用 48kbps 和 64kbps 而不是 32kbps。 一旦它找到提供足夠大的框架以支持 Info/Xing 標簽的配置,它就會停止。 (我沒有查看代碼,所以 FFMPEG 是如何真正找到足夠大的幀的,我不知道,但在我的最后,我只是將比特率索引字段增加了 1 直到frame size >= 192並且它工作)。

您可以通過首先使用 32kbps 比特率創建(或轉換)一個 44.1kHz 的 WAVE 文件來復制這一壯舉,然后嘗試使用 ffmpeg 將其轉換為 MP3,並查看 Info/Xing 標簽具有不同的比特率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM