如何使用libopus获得格式良好的opus文件

How to get a well formed opus file with libopus?

本文关键字:opus 文件 格式 何使用 libopus      更新时间:2023-10-16

我有。wav文件,我将使用opus对它们进行编码,在。opus文件中编写所有内容,然后使用vlc读取。我已经做了一些代码使用opus琐碎的例子,但质量很差。事实上,有一个问题,我从来没有写任何标题,这是正常的吗?我忘记了什么?

#define FRAME_SIZE 960
#define SAMPLE_RATE 48000 //frequence
#define CHANNELS 1 // up to 255
#define APPLICATION OPUS_APPLICATION_AUDIO
#define MAX_FRAME_SIZE 6*960
#define MAX_PACKET_SIZE (3*1276)
#define BUFFER_LEN  1024
int main(int argc, char **argv)
{
 char *inFile;
 FILE *fin;
 char *outFile;
 FILE *fout;
 opus_int16 in[FRAME_SIZE*CHANNELS];
 unsigned char cbits[MAX_PACKET_SIZE];
 OpusEncoder *encoder;
 int err;

 /*Create a new encoder state */
 encoder = opus_encoder_create(SAMPLE_RATE, CHANNELS, APPLICATION, &err);
 if (err<0)
 {
    fprintf(stderr, "failed to create an encoder: %sn",     opus_strerror(err));
  return EXIT_FAILURE;
 }
 opus_encoder_ctl(encoder, OPUS_SET_BITRATE(512000)); //500 to 512 000 // 350 000 pas trop mal
if (err<0)
{
   fprintf(stderr, "failed to set bitrate: %sn", opus_strerror(err));
    return EXIT_FAILURE;
}
 inFile = "toencode.wav";
 fin = fopen(inFile, "r");
if (fin==NULL)
{
   fprintf(stderr, "in: failed to open file: %sn", strerror(errno));
    return EXIT_FAILURE;
}
if (err<0)
{
   fprintf(stderr, "failed to create decoder: %sn", opus_strerror(err));
   return EXIT_FAILURE;
}
 outFile = "encoded.opus";
 fout = fopen(outFile, "w");
 if (fout==NULL)
 {
   fprintf(stderr, "failed to open file: %sn", strerror(errno));
   return EXIT_FAILURE;
 }
while (1)
{
   int i;
   unsigned char pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2];
   /* Read a 16 bits/sample audio frame. */
   fread(pcm_bytes, sizeof(short)*CHANNELS, FRAME_SIZE, fin);
   if (feof(fin))
      break;
   /* Convert from little-endian ordering. */
   for (i=0;i<CHANNELS*FRAME_SIZE;i++)
            in[i]=pcm_bytes[2*i+1]<<8|pcm_bytes[2*i];
  /* Encode the frame. */

   if (opus_encode(encoder, in, FRAME_SIZE, cbits, MAX_PACKET_SIZE)<0)
   {
     // fprintf(stderr, "encode failed: %sn", opus_strerror(nbBytes));
      return EXIT_FAILURE;
   }
   fwrite(in,sizeof(short),sizeof(in),fout);
}
 /*Destroy the encoder state*/
opus_encoder_destroy(encoder);
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}

我认为有一个真正的问题,我如何写文件,但我不知道它来自哪里,你能帮助我吗?

要制作一个可播放的.opus文件,您需要在写入流之前构造头文件并将它们封装在Ogg页面序列中。参见https://git.xiph.org/?p=opus-tools.git;a=blob;f=src/opusenc.c获取开源实现。

注意,如果对MAX_FRAME_SIZE使用960个样本,您将获得更好的结果。将比特率调到最大值也不会对声音产生太大的影响。