我有一个使用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并且正在读取立体声数据时),样本以一半的速度播放并出现乱码。
我错过了什么/做错了什么?