私は 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 ではコールバック関数 need_data_cb に入るたびにバッファがうまく再生されます。Android では、最初に need_data_cb に入ったときにバッファを再生し、その後は無音になります。両方のバージョンで同じコードを使用している場合に、なぜこれが発生するのですか。Android バージョンの need_data_cb を追加して、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 では gstreamer sdk チュートリアルのライブラリを使用しました。私の問題のヒントはありますか?
ありがとう、ラドゥ