Я работаю над игроком на основе учебников gstreamer. Для этого я создал трубопровод с помощью:Gstreamer Android change state state issue
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);
Мой poblem заключается в следующем: У меня есть один и тот же код в Linux и в Android. В буфере Linux хорошо воспроизводится каждый раз, когда он вводит функцию обратного вызова need_data_cb. В Android он воспроизводит буфер только в первый раз, когда он входит в need_data_cb, и после этого нет звука. Почему это происходит, когда у меня одинаковый код в обеих версиях. Если я добавлю в версию need_data_cb Android для изменения состояний конвейера для приостановки и воспроизведения перед добавлением буфера в appsrc, он воспроизводит каждый буфер времени, но с некоторыми прерываниями между каждым вызовом.
//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 я использовал libs из gstreamer sdk tutorials. У вас есть намек на мою проблему?
Спасибо, Radu