⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speexdec.c

📁 语音压缩和解压缩源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
      if (header->mode > forceMode)         *rate >>= (header->mode - forceMode);   }   speex_decoder_ctl(st, SPEEX_SET_SAMPLING_RATE, rate);   *nframes = header->frames_per_packet;   if (*channels==-1)      *channels = header->nb_channels;      if (!quiet)   {      fprintf (stderr, "Decoding %d Hz audio using %s mode",                *rate, mode->modeName);      if (*channels==1)         fprintf (stderr, " (mono");      else         fprintf (stderr, " (stereo");            if (header->vbr)         fprintf (stderr, ", VBR)\n");      else         fprintf(stderr, ")\n");      /*fprintf (stderr, "Decoding %d Hz audio at %d bps using %s mode\n",        *rate, mode->bitrate, mode->modeName);*/   }   *extra_headers = header->extra_headers;   free(header);   return st;}int main(int argc, char **argv){   int c;   int option_index = 0;   char *inFile, *outFile;   FILE *fin, *fout=NULL;   short out[MAX_FRAME_SIZE];   short output[MAX_FRAME_SIZE];   int frame_size=0;   void *st=NULL;   SpeexBits bits;   int packet_count=0;   int stream_init = 0;   int quiet = 0;   struct option long_options[] =   {      {"help", no_argument, NULL, 0},      {"quiet", no_argument, NULL, 0},      {"version", no_argument, NULL, 0},      {"version-short", no_argument, NULL, 0},      {"enh", no_argument, NULL, 0},      {"no-enh", no_argument, NULL, 0},      {"pf", no_argument, NULL, 0},      {"no-pf", no_argument, NULL, 0},      {"force-nb", no_argument, NULL, 0},      {"force-wb", no_argument, NULL, 0},      {"force-uwb", no_argument, NULL, 0},      {"rate", required_argument, NULL, 0},      {"mono", no_argument, NULL, 0},      {"stereo", no_argument, NULL, 0},      {"packet-loss", required_argument, NULL, 0},      {0, 0, 0, 0}   };   ogg_sync_state oy;   ogg_page       og;   ogg_packet     op;   ogg_stream_state os;   int enh_enabled;   int nframes=2;   int print_bitrate=0;   int close_in=0;   int eos=0;   int forceMode=-1;   int audio_size=0;   float loss_percent=-1;   SpeexStereoState stereo = SPEEX_STEREO_STATE_INIT;   int channels=-1;   int rate=0;   int extra_headers;   int wav_format=0;   enh_enabled = 1;   /*Process options*/   while(1)   {      c = getopt_long (argc, argv, "hvV",                       long_options, &option_index);      if (c==-1)         break;            switch(c)      {      case 0:         if (strcmp(long_options[option_index].name,"help")==0)         {            usage();            exit(0);         } else if (strcmp(long_options[option_index].name,"quiet")==0)         {            quiet = 1;         } else if (strcmp(long_options[option_index].name,"version")==0)         {            version();            exit(0);         } else if (strcmp(long_options[option_index].name,"version-short")==0)         {            version_short();            exit(0);         } else if (strcmp(long_options[option_index].name,"enh")==0)         {            enh_enabled=1;         } else if (strcmp(long_options[option_index].name,"no-enh")==0)         {            enh_enabled=0;         } else if (strcmp(long_options[option_index].name,"pf")==0)         {            fprintf (stderr, "--pf is deprecated, use --enh instead\n");            enh_enabled=1;         } else if (strcmp(long_options[option_index].name,"no-pf")==0)         {            fprintf (stderr, "--no-pf is deprecated, use --no-enh instead\n");            enh_enabled=0;         } else if (strcmp(long_options[option_index].name,"force-nb")==0)         {            forceMode=0;         } else if (strcmp(long_options[option_index].name,"force-wb")==0)         {            forceMode=1;         } else if (strcmp(long_options[option_index].name,"force-uwb")==0)         {            forceMode=2;         } else if (strcmp(long_options[option_index].name,"mono")==0)         {            channels=1;         } else if (strcmp(long_options[option_index].name,"stereo")==0)         {            channels=2;         } else if (strcmp(long_options[option_index].name,"rate")==0)         {            rate=atoi (optarg);         } else if (strcmp(long_options[option_index].name,"packet-loss")==0)         {            loss_percent = atof(optarg);         }         break;      case 'h':         usage();         exit(0);         break;      case 'v':         version();         exit(0);         break;      case 'V':         print_bitrate=1;         break;      case '?':         usage();         exit(1);         break;      }   }   if (argc-optind!=2 && argc-optind!=1)   {      usage();      exit(1);   }   inFile=argv[optind];   if (argc-optind==2)      outFile=argv[optind+1];   else      outFile = "";   wav_format = strlen(outFile)>=4 && (                                       strcmp(outFile+strlen(outFile)-4,".wav")==0                                       || strcmp(inFile+strlen(inFile)-4,".WAV")==0);   /*Open input file*/   if (strcmp(inFile, "-")==0)   {#if defined WIN32 || defined _WIN32      _setmode(_fileno(stdin), _O_BINARY);#endif      fin=stdin;   }   else    {      fin = fopen(inFile, "rb");      if (!fin)      {         perror(inFile);         exit(1);      }      close_in=1;   }   /*Init Ogg data struct*/   ogg_sync_init(&oy);      speex_bits_init(&bits);   /*Main decoding loop*/   while (1)   {      char *data;      int i, j, nb_read;      /*Get the ogg buffer for writing*/      data = ogg_sync_buffer(&oy, 200);      /*Read bitstream from input file*/      nb_read = fread(data, sizeof(char), 200, fin);            ogg_sync_wrote(&oy, nb_read);      /*Loop for all complete pages we got (most likely only one)*/      while (ogg_sync_pageout(&oy, &og)==1)      {         if (stream_init == 0) {            ogg_stream_init(&os, ogg_page_serialno(&og));            stream_init = 1;         }         /*Add page to the bitstream*/         ogg_stream_pagein(&os, &og);         /*Extract all available packets*/         while (!eos && ogg_stream_packetout(&os, &op)==1)         {            /*If first packet, process as Speex header*/            if (packet_count==0)            {               st = process_header(&op, enh_enabled, &frame_size, &rate, &nframes, forceMode, &channels, &stereo, &extra_headers, quiet);               if (!nframes)                  nframes=1;               if (!st)                  exit(1);               fout = out_file_open(outFile, rate, &channels);            } else if (packet_count==1)            {               if (!quiet)                  print_comments((char*)op.packet, op.bytes);            } else if (packet_count<=1+extra_headers)            {               /* Ignore extra headers */            } else {                              int lost=0;               if (loss_percent>0 && 100*((float)rand())/RAND_MAX<loss_percent)                  lost=1;               /*End of stream condition*/               if (op.e_o_s)                  eos=1;               /*Copy Ogg packet to Speex bitstream*/               speex_bits_read_from(&bits, (char*)op.packet, op.bytes);               for (j=0;j!=nframes;j++)               {                  int ret;                  /*Decode frame*/                  if (!lost)                     ret = speex_decode_int(st, &bits, output);                  else                     ret = speex_decode_int(st, NULL, output);                  /*for (i=0;i<frame_size*channels;i++)                    printf ("%d\n", (int)output[i]);*/                  if (ret==-1)                     break;                  if (ret==-2)                  {                     fprintf (stderr, "Decoding error: corrupted stream?\n");                     break;                  }                  if (speex_bits_remaining(&bits)<0)                  {                     fprintf (stderr, "Decoding overflow: corrupted stream?\n");                     break;                  }                  if (channels==2)                     speex_decode_stereo_int(output, frame_size, &stereo);                  if (print_bitrate) {                     int tmp;                     char ch=13;                     speex_decoder_ctl(st, SPEEX_GET_BITRATE, &tmp);                     fputc (ch, stderr);                     fprintf (stderr, "Bitrate is use: %d bps     ", tmp);                  }                  /*Convert to short and save to output file*/		  if (strlen(outFile)!=0)                  {                     for (i=0;i<frame_size*channels;i++)                        out[i]=le_short(output[i]);		  } else {                     for (i=0;i<frame_size*channels;i++)                        out[i]=output[i];		  }#if defined WIN32 || defined _WIN32                  if (strlen(outFile)==0)                      WIN_Play_Samples (out, sizeof(short) * frame_size*channels);                  else#endif                  fwrite(out, sizeof(short), frame_size*channels, fout);                                    audio_size+=sizeof(short)*frame_size*channels;               }            }            packet_count++;         }      }      if (feof(fin))         break;   }   if (wav_format)   {      if (fseek(fout,4,SEEK_SET)==0)      {         int tmp;         tmp = le_int(audio_size+36);         fwrite(&tmp,4,1,fout);         if (fseek(fout,32,SEEK_CUR)==0)         {            tmp = le_int(audio_size);            fwrite(&tmp,4,1,fout);         } else         {            fprintf (stderr, "First seek worked, second didn't\n");         }      } else {         fprintf (stderr, "Cannot seek on wave file, size will be incorrect\n");      }   }   if (st)      speex_decoder_destroy(st);   else    {      fprintf (stderr, "This doesn't look like a Speex file\n");   }   speex_bits_destroy(&bits);   if (stream_init)      ogg_stream_clear(&os);   ogg_sync_clear(&oy);#if defined WIN32 || defined _WIN32   if (strlen(outFile)==0)      WIN_Audio_close ();#endif   if (close_in)      fclose(fin);   if (fout != NULL)      fclose(fout);      return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -