実際のgstバージョンは1.8.1です。gstreamer 1.0でストリーミングオーディオをデコードし、波形データにアクセスしますか?
現在、私はgstreamerでエンコードされたストリームを受信し、サウンドカードで再生するコードを持っています。私はそれを変更して、アプリケーションに生の圧縮されていないオーディオデータへのアクセスを与えたいと思っています。これは、整数のサウンドサンプルの配列になるはずです。もしそれらをプロットすると、オーディオ波形が見えます(例えば、完全なトーンは素晴らしい正弦波になります)。そして、最新の配列をコールバックで最後に受け取ったものは不連続性が見えません。
これは、現在の再生コードです:私はappsinkにalsasinkを変更する必要があると思うし、それはデコーダを通過した後にオーディオの最新のチャンクを取得するコールバックを設定する https://github.com/lucasw/audio_common/blob/master/audio_play/src/audio_play.cpp
。
_sink = gst_element_factory_make("appsink", "sink");
g_object_set (G_OBJECT (_sink), "emit-signals", TRUE,
"sync", FALSE, NULL);
g_signal_connect (_sink, "new-sample",
G_CALLBACK (on_new_sample_from_sink), this);
をそしてコールバックがあります:これはhttps://github.com/jojva/gst-plugins-base/blob/master/tests/examples/app/appsink-src.cから構成されている
static GstFlowReturn
on_new_sample_from_sink (GstElement * elt, gpointer data)
{
RosGstProcess *client = reinterpret_cast<RosGstProcess*>(data);
GstSample *sample;
GstBuffer *app_buffer, *buffer;
GstElement *source;
/* get the sample from appsink */
sample = gst_app_sink_pull_sample (GST_APP_SINK (elt));
buffer = gst_sample_get_buffer (sample);
/* make a copy */
app_buffer = gst_buffer_copy (buffer);
/* we don't need the appsink sample anymore */
gst_sample_unref (sample);
/* get source and push new buffer */
source = gst_bin_get_by_name (GST_BIN (client->_sink), "app_source");
return gst_app_src_push_buffer (GST_APP_SRC (source), app_buffer);
}
は、私はそのコールバックでデータを取得することはできますか?私はGstFlowReturnで何をすべきですか?それが別のパイプライン要素にデータを渡しているのであれば、私はそれをやりたくはありません。
https://github.com/lucasw/audio_common/blob/appsink/audio_process/src/audio_process.cpp
(gint16配列にキャスト?)私が欲しい、まさにそのコールバックに渡さgpointerデータであり、あるいはどのように私は変換し、それをアクセスできますか?
ありがとう!私は現在、手動でFloat32に変換していますが、これは私のために設定する必要がある場合は、はるかに少なくなります。 –