2013-05-13 3 views
0

Я работаю над игроком на основе учебников 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

ответ

0

Проблема была из-за эмулятора. На устройстве все было в порядке. Не используйте эмуляторы, попробуйте отлаживать прямо на устройстве !!!