通过 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);
}
我正在尝试显示从 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);
}