通过 Android JNI 上的 Appsrc Gstreamer 接收视频数据缓冲区

Receive video data buffer by the Appsrc Gstreamer on Android JNI

我正在尝试显示从 UDP 套接字(已经标记 通过来自 AppSink 的回调)

这是我的代码,它应该显示接收到的数据:

静态无效 gst_native_receive_video_data(JNIEnv *env, jobject thiz, jbyteArray 数组) {

jbyte *data = (*env)->GetByteArrayElements(env, array, NULL);
jsize size = (*env)->GetArrayLength(env, array);

GstBuffer *buffer = gst_buffer_new_allocate(NULL, size, NULL);
gst_buffer_fill(buffer, 0, data, size);

gchar *videoConsumerString = g_strdup_printf(
        "appsrc name=source is-live=true do-timestamp=true min-latency=0 max-latency=100000000 ! video/x-raw,format=RGB,width=320,height=240,framerate=30/1 ! videoconvert ! autovideosink");
GstElement *consumer = gst_parse_launch(videoConsumerString, NULL);
g_free(videoConsumerString);

GstElement *source = gst_bin_get_by_name(GST_BIN(consumer), "source");
gst_app_src_push_buffer(GST_APP_SRC(source), buffer);
gst_element_set_state(consumer, GST_STATE_PLAYING);

gst_object_unref(source);
gst_object_unref(consumer);

(*env)->ReleaseByteArrayElements(env, array, data, JNI_ABORT);

}

请告诉我接收数据的正确显示方式

提前感谢您的帮助。

P.S: 我是 Gstreamer 社区的新手

我解决了这个问题,因为管道必须在另一个线程上,所以我把它放在另一个线程上。 这是使用读取缓冲区数据的管道:

pCustomData->pipeline = gst_parse_launch ("appsrc name=source ! application/x-rtp, encoding-name=H264 ! rtpjitterbuffer drop-on-latency=false latency=10 ! rtph264depay ! h264parse ! queue ! avdec_h264 ! queue ! videoconvert ! videoflip method=counterclockwise ! autovideosink",&error);

以及读取接收到的外部数据的方法:

静态无效 gst_native_receive_video_data(JNIEnv *env, jobject thiz, jbyteArray 数组) {

jbyte *temp = (*env)->GetByteArrayElements(env, array, NULL);
jsize size = (*env)->GetArrayLength(env, array);

GstBuffer *buffer = gst_buffer_new_allocate(NULL, size, NULL);
gst_buffer_fill(buffer, 0, temp, size);

GstElement *source = gst_bin_get_by_name(GST_BIN(pCustomData->pipeline), "source");
gst_app_src_push_buffer(GST_APP_SRC(source), buffer);

gst_object_unref(source);

(*env)->ReleaseByteArrayElements(env, array, temp, JNI_ABORT);

}