使用 VS2010 的 libsndfile 奇怪行为

Posted

技术标签:

【中文标题】使用 VS2010 的 libsndfile 奇怪行为【英文标题】:libsndfile weird behaviour using VS2010 【发布时间】:2013-01-15 21:14:28 【问题描述】:

我正在制作一个从麦克风录制的程序,然后使用 libsndfile 将其编码为 OGG 文件。

大约一个月前,我制作了这个程序的控制台版本,以确保录制和编码功能良好。现在,当我开始将这个程序作为一个窗口应用程序时,我发现唯一错误的是编码为 ogg 的函数。

这不是编译器或链接器错误,而是运行时错误。当我调用sf_format_check 函数时,它返回false,因此输出文件的参数有问题。所以我开始手动检查它是否在sf_format_check 函数中并且一切都正确。但是当我编译旧的控制台版本时,一切正常。

所以这是我的问题,这种行为的原因是什么?

这是我的功能。

static void encodeOgg (const char *infilename, const char *outfilename, int filetype)
   
  static short buffer [BUFFER_LEN] ;

  SNDFILE       *infile, *outfile ;
  SF_INFO       sfinfo,sf_in ;
  int           readcount ;

  fflush (stdout) ;
  sf_in.samplerate=SAMPLE_RATE;//44100
  sf_in.channels=NUM_CHANNELS;//1
  sf_in.format=SF_FORMAT_RAW | SF_FORMAT_PCM_16 ;
  if (! (infile = sf_open (infilename, SFM_READ, &sf_in)))
    error("Could not open output file") ;
    exit (1) ;
  
  sfinfo = sf_in;
  sfinfo.format = filetype ;//SF_FORMAT_OGG | SF_FORMAT_VORBIS

  if (! sf_format_check (&sfinfo)) //Here's the place where function exits
    sf_close (infile) ;
    error("Invalid encoding\n") ;
    exit (1) ;
  

  if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)))
    error("Error : could not open output file") ;
    exit (1) ;
  

  while ((readcount = sf_read_short (infile, buffer, BUFFER_LEN)) > 0)
  
    sf_write_short (outfile, buffer, readcount) ;
  
  sf_close (infile) ;
  sf_close (outfile) ;
  return ;

【问题讨论】:

Did it trows and exception?你能告诉我们更多关于调试的信息吗? 不,它不是基于异常。调试什么信息? 如果您在退出前评估会发生什么: sf_format_check (&​​sf_in) 那是什么?它给你一个真还是假? 检查参数。 mega-nerd.com/libsndfile/api.html#check这让我错了 它也给你从 in 文件中读取的结构错误? 【参考方案1】:

将 sf_in 中的每个值分配给 sfinfo,而不是使用结构的直接分配 (sfinfo=sf_in;)

sfinfo.sf_count_t=sf_in.sf_count_t;
...
sfinfo.seekable=sf_in.seekable;


typedef struct
          sf_count_t  frames ;     /* Used to be called samples. */
           int         samplerate ;
           int         channels ;
           int         format ;
           int         sections ;
           int         seekable ;
        SF_INFO ;

【讨论】:

在您的控制台版本中,您有相同的音频格式输出配置吗? (//SF_FORMAT_OGG | SF_FORMAT_VORBIS) 是的,我使用的函数和参数是一样的 抱歉,我不知道出了什么问题,祝你好运找出它是什么,我能想到的唯一最后一个“奇怪”的事情是静态函数......但它应该可以工作...

以上是关于使用 VS2010 的 libsndfile 奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的 libsndfile

使用 libsndfile 为 MATLAB 编写多声道音频

将 wav 文件与 libsndfile 混合时的工件

VS2010 中的 C++ 智能感知

vs2010怎么让打右大括号的时候代码自动对齐

仅在 VS 2010 上运行时:COMException:灾难性故障:错误代码:-2147418113