0

我正在基于 gstreamer 教程的播放器中工作。为此,我使用以下方法创建了一个管道:

pipeline    = gst_pipeline_new("audio-player");

//adding also 3 gstreamer elements
appsrc      = gst_element_factory_make("appsrc", "source");
decoder     = gst_element_factory_make("faad", "aac-decoder");
sink        = gst_element_factory_make("autoaudiosink", "audio-output");

//adding and linking the elements to the pipeline
gst_bin_add_many (GST_BIN (pipeline), appsrc, decoder, sink, NULL);
gst_element_link_many(appsrc, decoder,sink, NULL);

//for appsrc was added a callback function need_data_cb
g_signal_connect(appsrc, "need-data", (GCallback)need_data_cb, data);

//state of pipeline is set to playing
gst_element_set_state(pipeline, GST_STATE_PLAYING);

在 need_data_cb 函数中,我有一个要播放的缓冲区:

g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);

我的问题是:我在 Linux 和 Android 中有相同的代码。在Linux中buffer每次进入回调函数need_data_cb时都会被播放好。在 Android 中,它仅在第一次进入 need_data_cb 时播放缓冲区,之后就没有声音了。为什么当我在两个版本中都有相同的代码时会发生这种情况。如果我在将缓冲区添加到appsrc之前添加了need_data_cb Android版本以将管道状态更改为暂停和播放,它会播放每次缓冲区,但每次调用之间都会出现一些中断。

//the first 2 lines added in Android version to play each time buffer
gst_element_set_state(pipeline, GST_STATE_PAUSED);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);

问题是为什么在没有这些行的情况下在 Linux 上可以正常工作而在 Android 上不行?在 Linux 上我安装了 gstreamer 0.10 版本,在 Android 上我使用了 gstreamer sdk 教程中的库。你对我的问题有什么提示吗?

谢谢,拉杜

4

1 回答 1

0

问题出在模拟器上。在设备上一切正常。不要使用模拟器尝试直接在设备上调试!!!

于 2013-05-24T13:07:05.693 回答