Как обрезать данные PCM, чтобы определить количество выборок или количество кадров для подачи?

Я хочу передать libsamplerate (библиотека для понижения дискретизации аудиоданных, для которой требуется заполнить следующую структуру:

typedef struct
  {   float  *data_in, *data_out ;

      long   input_frames, output_frames ;
      long   input_frames_used, output_frames_gen ;

      int    end_of_input ;

      double src_ratio ;
  } SRC_DATA ;

Поля этой структуры, которые должны быть заполнены вызывающей стороной:

  data_in       : A pointer to the input data samples.
  input_frames  : The number of frames of data pointed to by data_in.
  data_out      : A pointer to the output data samples.
  output_frames : Maximum number of frames pointer to by data_out.
  src_ratio     : Equal to output_sample_rate / input_sample_rate.
  end_of_input  : Equal to 0 if more input data is available and 1 
                  otherwise.

Чтобы заполнить эту структуру, у меня есть data_in, но я не знаю количество кадров, поэтому не могу определить input_frames. Есть ли простой способ обрезать поток байтов PCM? Так что я могу ввести его в эту функцию также с правильным количеством кадров. (Так что этот вопрос не имеет прямого отношения к libsamplerate)


person frankish    schedule 22.07.2013    source источник
comment
Я предполагаю, что вы собираетесь разбивать аудио на фрагменты - скажем, 1024 кадра за раз (отсюда и элемент end_of_input в структуре). Очевидно, что ваш последний звонок может иметь меньше, когда вы знаете, что находитесь в конце потока.   -  person marko    schedule 22.07.2013
comment
У меня есть data_in, но я не знаю количество кадров У вас есть массив входных отсчетов, но вы не знаете, сколько у вас есть отсчетов?   -  person Bjorn Roche    schedule 22.07.2013
comment
@BjornRoche хорошо, я думаю, что могу рассчитать образцы, разделив размер байта data_in на 2 (умножить на 8 (бит) и разделить на 16 (бит) для 44100 16-битных моно cpm и для стерео снова разделить все на 2 ..) Но я может быть не в начале кадра. Поэтому я думаю, что мне нужно отбросить эти байты, прежде чем вводить их в качестве входных данных. Вот почему я думаю, что мне нужно найти эту точку, чтобы обрезать звук. Я ошибся?   -  person frankish    schedule 22.07.2013
comment
Не помещайте 16-битные массивы в libsamplerate. data_in и data_out явно помечены как тип float, поэтому вы должны сначала преобразовать в этот тип. Я думаю, вам нужно немного ознакомиться с основами: blog.bjornroche.com/2013/05/   -  person Bjorn Roche    schedule 23.07.2013