gpt4 book ai didi

c++ - MP3 帧头检测 FFF/FFE 同步问题

转载 作者:行者123 更新时间:2023-11-30 17:50:29 24 4
gpt4 key购买 nike

我正在尝试解析 MP3 文件并检测可变比特率 (VBR) MP3 文件中的所有帧。我浏览了整个互联网,但找不到合适的解决方案来检测新的帧头同步。从其他帖子来看,它说我应该寻找 FFE 或 FFF,但在我的程序中它不会正确检测到它。我不明白我应该如何寻找 FFF 或 FFE ?我得到的 FFE 为 0xF,下一个字节为 0xFE,但是如何得到 FFF 我从中获取 header 来构建所需的 11 位 1 ?我看过this它在所有其他主题和网站中链接为 MP3 引用及其源代码,但涵盖我的问题的部分是,我认为在 CMPA* 文件中未在源代码下载中给出。

do 
{
uiFrame = getc(pFile);
if(EOF == uiFrame)
break;
cntSize++;
if(0xFF == uiFrame)
{
uiFrame = getc(pFile);
if(EOF == uiFrame)
break;
if((0xE == uiFrame) )//|| (0xE0 == uiFrame))
{
if(1 != uiFrameCount)
printf("\nFrame Size is %d \n\n",cntSize - PrevoiusFrameSize);

printf("\nFrame Found at Byte %d", cntSize);
PrevoiusFrameSize = cntSize;
CheckFlag = 1;
uiFrameCount++;
}
cntSize++;
}
}while(1 != CheckFlag);

当我执行上面的代码或我能想到的任何变体时,我会获得 1 到 6 帧,而如果我使用上面链接中的程序本身,它会在我的测试 mp3 文件上显示 8855 帧。任何有关此事的帮助将不胜感激,因为我已经没有想法和谷歌页面来寻找答案了。

感谢您的帮助。

编辑:在 Marc B 的快速回复后,我基本上理解了这个问题,但在编辑以反射(reflect)他的答案后,我现在只检测到 4 帧,从一帧增加到 4 帧。这是进行帧检测的代码部分,我做错了什么吗?

do 
{
uiFrame = getc(pFile);
if(EOF == uiFrame)
break;
cntSize++;
if(0xFF == uiFrame)
{
uiFrame = getc(pFile);
if(EOF == uiFrame)
break;
uiShift=uiFrame>>4;
if((0xE == uiShift) || (0xF == uiShift))
{
if(1 != uiFrameCount)
printf("\nFrame Size is %d \n\n",cntSize - PrevoiusFrameSize);

printf("\nFrame Found at Byte %d", cntSize);
PrevoiusFrameSize = cntSize;
CheckFlag = 1;
uiFrameCount++;
}
cntSize++;
}
}while(1 != CheckFlag);

最佳答案

header 有 3 个半字节(也称为 1.5 个字节),因此您需要进行一些位移。伪代码:

$data = 'FFEABCDEF....'
^^^--3 nibble header
$nibble1 = $data[0];
$nibble2 = $data[1] >> 4; // isolate 3rd nibble
if ($nibble1 == 'FF') && (($nibble2 == 'F') || ($nibble2 == 'E')) { ... }

关于c++ - MP3 帧头检测 FFF/FFE 同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17255173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com