使用GStreamer AppSrc元素播放立体声数据时出现问题

时间:2018-01-01 20:10:08

标签: c audio gstreamer

我有一个使用AppSrc GStreamer元素播放浮动音频样本的程序。我调整了here的代码。

这是我用来将数据推送到AppSrc的函数:

static gboolean push_data (CustomData *data) {
  GstBuffer *buffer;
  GstFlowReturn ret;
  GstMapInfo map;
  SAMPLE *raw;
  gint num_frames = CHUNK_SIZE / sizeof(SAMPLE) / data->channels;

  /* Create a new empty buffer */
  buffer = gst_buffer_new_and_alloc (CHUNK_SIZE);

  /* Set its timestamp and duration */
  GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (data->playback_offset, GST_SECOND, data->samplerate);
  GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (CHUNK_SIZE / data->channels / sizeof(SAMPLE), GST_SECOND, data->samplerate);

  /* Generate some psychodelic waveforms */
  gst_buffer_map (buffer, &map, GST_MAP_WRITE);
  raw = (SAMPLE *) map.data;

  memcpy(raw, data->samples + data->playback_offset, MIN(data->size - data->playback_offset, CHUNK_SIZE));

  gst_buffer_unmap (buffer, &map);
  data->playback_offset += num_frames;

  /* Push the buffer into the appsrc */
  g_signal_emit_by_name (data->app_source, "push-buffer", buffer, &ret);

  /* Free the buffer now that we are done with it */
  gst_buffer_unref (buffer);

  if (ret != GST_FLOW_OK) {
    /* We got some error, stop sending data */
    return FALSE;
  }

  if (data->playback_offset >= data->size)
  {
      puts("Reached end of sample.");
      gst_app_src_end_of_stream ((GstAppSrc *) data->app_source);
      g_main_loop_quit (data->main_loop);
  }

  return TRUE;
}

在使用管道之前,我还将元素的CAPS设置为样本格式:

  /* Configure appsrc */
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, (gint) data.samplerate, (gint) data.channels, NULL);
  audio_caps = gst_audio_info_to_caps (&info);
  g_object_set (data.app_source, "caps", audio_caps, "format", GST_FORMAT_TIME, NULL);
  g_signal_connect (data.app_source, "need-data", G_CALLBACK (start_feed), &data);
  g_signal_connect (data.app_source, "enough-data", G_CALLBACK (stop_feed), &data);

(完整计划here

该程序按单个样本的预期工作。 但是,当我尝试播放立体声样本(data.channels设置为2并且正在读取立体声数据时),样本以一半的速度播放并出现乱码。

我错过了什么/做错了什么?

0 个答案:

没有答案