我已经卡了两天,这个计算似乎很简单,但我就是不明白。
我正在使用压缩算法对音频文件进行编码。
整个音频文件被分成了每个960字节的"块"。每个块被压缩为60字节。
我的未压缩文件长度为1480320字节。我的编码文件长度为46320字节。
似乎有些不对劲。我试图从已编码音频的文件大小中计算理论上的未压缩文件大小。
以下是文件的编码方式:
short *m_in;
short *m_out;
unsigned char *m_data;
unsigned char *m_fbytes;
int m_max_frame_size;
int m_frame_size;
int m_sampling_rate;
int m_max_payload_bytes;
int m_bitrate_bps;
int m_iByteLen1FrameEncoded;
int m_iByteLen1FrameDecoded;
m_sampling_rate=48000;
m_max_frame_size = 960*6;
m_max_payload_bytes=1500;
m_bitrate_bps= 24000;
m_iByteLen1FrameEncoded=60;
m_iByteLen1FrameDecoded=960;
m_in = (short*)malloc(m_max_frame_size*sizeof(short));
m_out = (short*)malloc(m_max_frame_size*sizeof(short));
m_data = (unsigned char*)calloc(m_max_payload_bytes,sizeof(char));
m_fbytes = (unsigned char*)malloc(m_iByteLen1FrameDecoded*sizeof(short));
FILE *fin= fopen(uPathInput.c_str(), "rb");
FILE *fout=fopen(uPathOutput.c_str(), "wb");
int curr_read=0;
int stop=0;
while (!stop)
{
int err;
err = fread(m_fbytes, sizeof(short), 960, fin);
curr_read = err;
for(int i=0;i<curr_read;i++)
{
opus_int32 s;
s=m_fbytes[2*i+1]<<8|m_fbytes[2*i];
s=((s&0xFFFF)^0x8000)-0x8000;
m_in[i]=s;
}
if (curr_read < 960)
{
for (int i=curr_read;i<960;i++)
{
m_in[i] = 0;
}
stop = 1;
}
//iLen will always return 60, so I guess the 960 bytes are compressed to 60 bytes, right?
int iLen = opus_encode(m_enc, m_in, m_iByteLen1FrameDecoded, m_data, m_max_payload_bytes);
if (fwrite(m_data, 1, iLen, fout) !=iLen)
{
fprintf(stderr, "Error writing.\n");
}
}
fclose(fin);
fclose(fout);
}
压缩比似乎是960/60 = 16
所以我计算了46320字节*16。 但这让我得到741120字节。 而那不合适。我预期它应该是1480320字节。
我试图找出我的计算错误,但我就是做不到。
有人看到我哪里错了吗?
非常感谢您的任何帮助!
m_fbytes
、s
、m_data
、m_enc
、m_in
的目的是什么?在 SO 代码示例中应避免使用缩写或匈牙利命名法,或者至少包括带有说明其目的的注释的变量声明。 - millimoose