Android上的简单编码器Gstreamer

时间:2015-10-20 07:43:36

标签: android gstreamer encode

我只是尝试在Gstreamer 1.0中使用编码器进行简单的演示。但它不起作用。调用" push-buffer"。

时总是返回错误
#define BUFFER_SIZE  1228800   //640x480x 4 byte/pixel

static void cb_need_video_data (GstElement *appsrc,guint unused_size, CustomData* user_data)
{
  static gboolean white = FALSE;
  static GstClockTime timestamp = 0;
  GstBuffer *buffer;
  guint size = BUFFER_SIZE;
  GstFlowReturn ret;
  user_data->num_frame++;

  if (user_data->num_frame >= TOTAL_FRAMES) {
    /* we are EOS, send end-of-stream and remove the source */
    g_signal_emit_by_name (user_data->source, "end-of-stream", &ret);
    g_print ("start TOTAL_FRAMES");
    return ;
  }
  buffer = gst_buffer_new_allocate (NULL, size, NULL);
  gst_buffer_memset (buffer, 0, white ? 0xff : 0x0, size);
  white = !white;

  GST_BUFFER_PTS (buffer) = timestamp;
  GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 2);

  timestamp += GST_BUFFER_DURATION (buffer);
  g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
  if (ret != GST_FLOW_OK) {
    /* something wrong, stop pushing */
    GST_DEBUG("QUIT MAIN LOOP %d",ret);
    g_main_loop_quit (user_data->main_loop);
  }
}

void gst_set_pipeline(JNIEnv* env, jobject thiz,jstring uri){
  CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
  gchar *string = NULL;
  string =
          g_strdup_printf ("appsrc is-live=true name=testsource "
                                   "queue ! videoconvert ! videoscale "
                                   "add-borders=true ! videorate ! x264enc "
                                   "! mpegtsmux "
                                   "! filesink "
                                   "location=/storage/emulated/0/test.avi sync=false append=true",

  data->pipeline = gst_parse_launch (string, NULL);
  g_free (string);
  if (data->pipeline == NULL) {
    g_print ("Bad sink\n");
    return;
  }
  data->vsource = gst_bin_get_by_name (GST_BIN (data->pipeline), "testsource");

  GstCaps *caps;

  caps = gst_caps_new_simple ("video/x-raw",
                              "format", G_TYPE_STRING, "RGB",
                              "width", G_TYPE_INT, 640,
                              "height", G_TYPE_INT, 480,
                              "framerate", GST_TYPE_FRACTION, 25, 1,
                              NULL);
  gst_app_src_set_caps(GST_APP_SRC(data->vsource), caps);

  g_object_set (G_OBJECT(data->vsource),"stream-type", 0, "format", GST_FORMAT_TIME, NULL);
  g_signal_connect (data->vsource, "need-data", G_CALLBACK (cb_need_video_data), data);
}

当我将状态设置为GST_STATE_PLAYING时,它会进入cb_need_video_data一次并获得ret!= GST_FLOW_OK。我认为上限和输入数据不匹配,但我不知道为什么。 我只是Gstreamer的新手。请帮我纠正上面的代码。谢谢大家

0 个答案:

没有答案