{"id":449,"date":"2021-03-19T12:18:30","date_gmt":"2021-03-19T03:18:30","guid":{"rendered":"https:\/\/sirius10.dip.jp\/blog\/wordpress\/?p=449"},"modified":"2021-03-31T13:44:10","modified_gmt":"2021-03-31T04:44:10","slug":"gstreamer2","status":"publish","type":"post","link":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/2021\/03\/19\/449\/","title":{"rendered":"Gstreamer(2)"},"content":{"rendered":"\n<p>Gstreamer \u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u3044\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3000omxh264enc \u306f\u30d3\u30c3\u30c8\u30ec\u30fc\u30c8\u3092\u6307\u5b9a\u3059\u308b\u3068\u5999\u306a\u30ce\u30a4\u30ba\u304c\u5165\u308a\u307e\u3059\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8a2d\u5b9a\u3067\u306f\u753b\u8cea\u306b\u6e80\u8db3\u3067\u304d\u306a\u3044\u306e\u3067\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3057\u305f\u3068\u304d\u306b\u5909\u5316\u304c\u3042\u308b\u304b\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">videotestsrc \u3092\u8868\u793a\u3059\u308b<\/h2>\n\n\n\n<p>\u3000\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u304b\u3089\u3001gst-launch-1.0 testvideosrc num-buffers=30 ! autovideosink \u3092\u5b9f\u884c\u3057\u305f\u5834\u5408\u3092\u30d7\u30ed\u30b0\u30e9\u30e0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3000\u6b21\u306e\u5185\u5bb9\u306b\u30d5\u30a1\u30a4\u30eb view.c \u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"file pre\"><code>\/*\n * example view.c\n *  gst-launch-1.0 videotestsrc num-buffers=30 ! autovideosink\n *\/\n\n#include &lt;gst\/gst.h&gt;\n#include &lt;glib.h&gt;\n\nstatic gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)\n{\n    GMainLoop *loop = (GMainLoop *)data;\n\n    switch( GST_MESSAGE_TYPE (msg) ) {\n        case GST_MESSAGE_EOS:\n            g_print(\"End of stream\\n\");\n            g_main_loop_quit(loop);\n            break;\n\n        case GST_MESSAGE_ERROR: {\n            gchar  *debug;\n            GError *error;\n\n            gst_message_parse_error(msg, &amp;error, &amp;debug);\n            g_free(debug);\n\n            g_printerr(\"Error: %s\\n\", error-&gt;message);\n            g_error_free(error);\n\n            g_main_loop_quit(loop);\n            break;\n        }\n        default:\n            break;\n    }\n    return TRUE;\n}\n\nint main(int argc, char *argv[])\n{\n    GMainLoop *loop;\n    GstElement *pipeline, *source, *sink;\n    GstBus *bus;\n\n    \/* \u521d\u671f\u5316 *\/\n    gst_init(&amp;argc, &amp;argv);\n\n    loop = g_main_loop_new(NULL, FALSE);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u4f5c\u6210 *\/\n    pipeline = gst_pipeline_new(\"audio-player\");\n    source   = gst_element_factory_make(\"videotestsrc\", \"Test-Video-source\");\n    sink     = gst_element_factory_make(\"autovideosink\", \"video-output\");\n\n    if( !pipeline || !source || !sink ) {\n        g_printerr(\"One element could not be created. Exiting.\\n\");\n        return -1;\n    }\n\n    \/* \u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8a2d\u5b9a *\/\n    g_object_set(G_OBJECT(source), \"num-buffers\", 30, NULL);\n\n    \/* \u30e1\u30c3\u30bb\u30fc\u30b8\u30cf\u30f3\u30c9\u30e9\u3092\u8a2d\u5b9a *\/\n    bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline));\n    gst_bus_add_watch(bus, bus_call, loop);\n    gst_object_unref(bus);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u3092\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306b\u8ffd\u52a0 *\/\n    gst_bin_add_many(GST_BIN (pipeline), source, sink, NULL);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u30ea\u30f3\u30af *\/\n    gst_element_link (source, sink);\n\n    \/* \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u518d\u751f *\/\n    gst_element_set_state (pipeline, GST_STATE_PLAYING);\n\n   \/* \u518d\u751f\u4e2d *\/\n    g_print (\"Running...\\n\");\n    g_main_loop_run (loop);\n\n\n    \/* \u7d42\u4e86\u51e6\u7406 *\/\n    g_print (\"Returned, stopping playback\\n\");\n    gst_element_set_state (pipeline, GST_STATE_NULL);\n\n    g_print (\"Deleting pipeline\\n\");\n    gst_object_unref (GST_OBJECT (pipeline));\n\n    return 0;\n}<\/code><\/p>\n\n\n\n<p>\u3000\u6b21\u306e\u5185\u5bb9\u306e Makefile \u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"file pre\"><code>TARGET=view\n\nLIBS:=$(shell pkg-config --libs gstreamer-app-1.0)\nCFLAGS:=$(shell pkg-config --cflags gstreamer-app-1.0)\n\nall : $(TARGET)\n\nview : view.o\n        gcc -o $@ $&lt; $(LIBS)\n\n.c.o : \n        gcc $(CFLAGS) -c $&lt;\n\nclean :\n        rm -f *.o $(TARGET)\n<\/code><\/p>\n\n\n\n<p> make \u3067 view \u304c\u7c89\u30d1\u30a4\u30eb\u3067\u304d\u307e\u3059\u3002\u5b9f\u884c\u3059\u308c\u3070\u300130 frame \u3060\u3051\u30c6\u30b9\u30c8\u6620\u50cf\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HDMI \u304b\u3089\u53d6\u308a\u8fbc\u307f\u8868\u793a\u3059\u308b<\/h2>\n\n\n\n<p>\u3000\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u76f8\u5f53\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"console pre\"><code>gst-launch-1.0 -v v4l2src device=\/dev\/video0 ! \\\n    videorate ! \\\n    image\/jpeg,width=1280,height=720,framerate=30\/1 ! \\\n    jpegdec ! videoconvert ! videoscale ! \\\n    video\/x-raw,width=640 ! ximagesink<\/code><\/p>\n\n\n\n<p>\u3000HDMIview.c \u3092\u4f5c\u8a5e\u3057\u307e\u3059\u3002\u5185\u5bb9\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"file pre\"><code>\/*\n * example HDMIview.c\n *  gst-launch-1.0 gst-launch-1.0 -v v4l2src device=\/dev\/video0 ! \\\n *      videorate !  image\/jpeg,width=1280,height=720,framerate=30\/1 ! \\\n *      jpegdec ! videoconvert ! videoscale ! video\/x-raw,width=640 ! \\\n *      ximagesink\n *\/\n\n#include &lt;gst\/gst.h&gt;\n#include &lt;glib.h&gt;\n\nstatic gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)\n{\n    GMainLoop *loop = (GMainLoop *)data;\n\n    switch( GST_MESSAGE_TYPE (msg) ) {\n        case GST_MESSAGE_EOS:\n            g_print(\"End of stream\\n\");\n            g_main_loop_quit(loop);\n            break;\n\n        case GST_MESSAGE_ERROR: {\n            gchar  *debug;\n            GError *error;\n\n            gst_message_parse_error(msg, &amp;error, &amp;debug);\n            g_free(debug);\n\n            g_printerr(\"Error: %s\\n\", error-&gt;message);\n            g_error_free(error);\n\n            g_main_loop_quit(loop);\n            break;\n        }\n        default:\n            break;\n    }\n    return TRUE;\n}\n\nint main(int argc, char *argv[])\n{\n    GMainLoop *loop;\n    GstElement *pipeline, *source, *rate, *filter1, *decode, *convert,\n               *scale, *filter2, *sink;\n    GstCaps *filtercaps;\n    GstBus *bus;\n\n    \/* \u521d\u671f\u5316 *\/\n    gst_init(&amp;argc, &amp;argv);\n\n    loop = g_main_loop_new(NULL, FALSE);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u4f5c\u6210 *\/\n    pipeline = gst_pipeline_new(\"video-player\");\n    source   = gst_element_factory_make(\"v4l2src\", NULL);\n    rate     = gst_element_factory_make(\"videorate\", NULL);\n    filter1  = gst_element_factory_make(\"capsfilter\", NULL);\n    decode   = gst_element_factory_make(\"jpegdec\", NULL);\n    convert  = gst_element_factory_make(\"videoconvert\", NULL);\n    scale    = gst_element_factory_make(\"videoscale\", NULL);\n    filter2  = gst_element_factory_make(\"capsfilter\", NULL);\n    sink     = gst_element_factory_make(\"ximagesink\", NULL);\n\n    if( !pipeline || !source || !rate || !filter1 ||\n        !decode || !convert || !scale || !filter2 || !sink ) {\n        g_printerr(\"One element could not be created. Exiting.\\n\");\n        return -1;\n    }\n\n    \/* \u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8a2d\u5b9a *\/\n    g_object_set(G_OBJECT(source), \"device\", \"\/dev\/video0\", NULL);\n\n    \/* \u30d5\u30a3\u30eb\u30bf\u4f5c\u6210 *\/\n    filtercaps = gst_caps_new_simple(\"image\/jpeg\",\n                     \"width\", G_TYPE_INT, 1280,\n                     \"height\", G_TYPE_INT, 720,\n                     \"framerate\", GST_TYPE_FRACTION, 30, 1,\n                     NULL);\n    g_object_set(G_OBJECT(filter1), \"caps\", filtercaps, NULL);\n    gst_caps_unref(filtercaps);\n    filtercaps = gst_caps_new_simple(\"video\/x-raw\",\n                     \"width\", G_TYPE_INT, 640,\n                     NULL);\n    g_object_set(G_OBJECT(filter2), \"caps\", filtercaps, NULL);\n    gst_caps_unref(filtercaps);\n\n    \/* \u30e1\u30c3\u30bb\u30fc\u30b8\u30cf\u30f3\u30c9\u30e9\u306e\u8a2d\u5b9a *\/\n    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));\n    gst_bus_add_watch(bus, bus_call, loop);\n    gst_object_unref(bus);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u3092\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306b\u8ffd\u52a0 *\/\n    gst_bin_add_many(GST_BIN(pipeline), source, rate, filter1, decode,\n convert, scale, filter2, sink, NULL);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u30ea\u30f3\u30af *\/\n    gst_element_link_many(source, rate, filter1, decode, convert, scale,\n filter2, sink, NULL);\n\n    \/* \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u518d\u751f *\/\n    gst_element_set_state (pipeline, GST_STATE_PLAYING);\n\n\n    \/* \u518d\u751f\u4e2d *\/\n    g_print (\"Running...\\n\");\n    g_main_loop_run (loop);\n\n\n    \/* \u7d42\u4e86\u51e6\u7406 *\/\n    g_print (\"Returned, stopping playback\\n\");\n    gst_element_set_state (pipeline, GST_STATE_NULL);\n\n    g_print (\"Deleting pipeline\\n\");\n    gst_object_unref (GST_OBJECT (pipeline));\n\n    return 0;\n}<\/code><\/p>\n\n\n\n<p>\u3000Makefile \u306f\u6b21\u306e\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"file pre\"><code>TARGET=view HDMIview\n\nLIBS:=$(shell pkg-config --libs gstreamer-app-1.0)\nCFLAGS:=$(shell pkg-config --cflags gstreamer-app-1.0)\n\nall : $(TARGET)\n\n.c.o : \n\tgcc $(CFLAGS) -c $&lt;\n\nHDMIview : HDMIview.o\n\tgcc -o $@ $&lt; $(LIBS)\n\nview : view.o\n\tgcc -o $@ $&lt; $(LIBS)\n\nclean :\n\trm -f *.o $(TARGET)<\/code><\/p>\n\n\n\n<p>\u3000HDMI \u304b\u3089\u53d6\u308a\u8fbc\u3093\u3060\u6620\u50cf\u304c\u8868\u793a\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">omxh264enc \u3092\u4f7f\u3063\u3066\u30a8\u30f3\u30b3\u30fc\u30c9\u3057\u3066\u307f\u308b<\/h2>\n\n\n\n<p class=\"console pre\"><code>gst-launch-1.0 v4l2src device=\/dev\/video0 ! \\\n    videorate ! \\\n    image\/jpeg,width=1280,height=720,framerate=30\/1 ! \\\n    jpegdec ! tee name=v \\\n    v. ! queue ! videoconvert ! videoscale ! \\\n                 video\/x-raw,width=640 ! ximagesink \\\n    v. ! queue ! omxh264enc ! video\/x-h264,profile=high ! \\\n                 h264parse config-interval=4 ! \\\n                 mpegtsmux ! filesink location=test.ts<\/code><\/p>\n\n\n\n<p>\u3000\u4e0a\u8a18\u76f8\u5f53\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002HDMIrec.c \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"file pre\"><code>\/*\n * example HDMIrec.c\n *  gst-launch-1.0 gst-launch-1.0 -v v4l2src device=\/dev\/video0 ! \\\n *      videorate ! image\/jpeg,width=1280,height=720,framerate=30\/1 ! \\\n *      jpegdec ! tee name=v \\\n *      v. ! queue ! videoconvert ! videoscale ! \n *                   video\/x-raw,width=640 ! ximagesink \\\n *      v. ! queue ! omxh264enc ! video\/x-h264,profile=high ! \\\n *                   h264parse config-interval=4 ! \\\n *                   mpegtsmux ! filesink location=test.ts\n *\/\n\n#include &lt;gst\/gst.h&gt;\n#include &lt;glib.h&gt;\n\nstatic gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)\n{\n    GMainLoop *loop = (GMainLoop *)data;\n\n    switch( GST_MESSAGE_TYPE (msg) ) {\n        case GST_MESSAGE_EOS:\n            g_print(\"End of stream\\n\");\n            g_main_loop_quit(loop);\n            break;\n\n        case GST_MESSAGE_ERROR: {\n            gchar  *debug;\n            GError *error;\n\n            gst_message_parse_error(msg, &amp;error, &amp;debug);\n            g_free(debug);\n\n            g_printerr(\"Error: %s\\n\", error-&gt;message);\n            g_error_free(error);\n\n            g_main_loop_quit(loop);\n            break;\n        }\n        default:\n            break;\n    }\n    return TRUE;\n}\n\nint main(int argc, char *argv[])\n{\n    GMainLoop *loop;\n    GstElement *pipeline, *source, *rate, *filter1, *decode, *convert,\n               *scale, *filter2, *tee, *queue_d, *sink;\n    GstElement *queue_f, *encode, *filter3, *parse, *mux, *filesink;\n    GstCaps *filtercaps;\n    GstBus *bus;\n\n    \/* \u521d\u671f\u5316 *\/\n    gst_init(&amp;argc, &amp;argv);\n\n    loop = g_main_loop_new(NULL, FALSE);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u4f5c\u6210 *\/\n    pipeline = gst_pipeline_new(\"video-player\");\n    source   = gst_element_factory_make(\"v4l2src\", NULL);\n    rate     = gst_element_factory_make(\"videorate\", NULL);\n    filter1  = gst_element_factory_make(\"capsfilter\", NULL);\n    decode   = gst_element_factory_make(\"jpegdec\", NULL);\n    convert  = gst_element_factory_make(\"videoconvert\", NULL);\n    scale    = gst_element_factory_make(\"videoscale\", NULL);\n    filter2  = gst_element_factory_make(\"capsfilter\", NULL);\n    sink     = gst_element_factory_make(\"ximagesink\", NULL);\n    tee      = gst_element_factory_make(\"tee\", NULL);\n    queue_d  = gst_element_factory_make(\"queue\", NULL);\n    queue_f  = gst_element_factory_make(\"queue\", NULL);\n    encode   = gst_element_factory_make(\"omxh264enc\", NULL);\n    filter3  = gst_element_factory_make(\"capsfilter\", NULL);\n    parse    = gst_element_factory_make(\"h264parse\", NULL);\n    mux      = gst_element_factory_make(\"mpegtsmux\", NULL);\n    filesink = gst_element_factory_make(\"filesink\", NULL);\n\n    if( !pipeline || !source || !rate || !filter1 ||\n        !decode || !convert || !scale || !filter2 || !sink ||\n        !tee || !queue_d || !queue_f || !encode || ! filter3 ||\n        !parse || !mux || !filesink ) {\n        g_printerr(\"One element could not be created. Exiting.\\n\");\n        return -1;\n    }\n\n    \/* \u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8a2d\u5b9a *\/\n    g_object_set(G_OBJECT(source), \"device\", \"\/dev\/video0\", NULL);\n    g_object_set(G_OBJECT(parser), \"config-interval\", 4, NULL);\n    g_object_set(G_OBJECT(filesink), \"location\", \"test.ts\", NULL);\n\/*    g_object_set(G_OBJECT(encoder), \"target-bitrate\", 1000000, NULL);\n    g_object_set(G_OBJECT(encoder), \"control-rate\", 1, NULL);*\/\n\n    \/* \u30d5\u30a3\u30eb\u30bf\u4f5c\u6210 *\/\n    filtercaps = gst_caps_new_simple(\"image\/jpeg\",\n                     \"width\", G_TYPE_INT, 1280,\n                     \"height\", G_TYPE_INT, 720,\n                     \"framerate\", GST_TYPE_FRACTION, 30, 1,\n                     NULL);\n    g_object_set(G_OBJECT(filter1), \"caps\", filtercaps, NULL);\n    gst_caps_unref(filtercaps);\n    filtercaps = gst_caps_new_simple(\"video\/x-raw\",\n                     \"width\", G_TYPE_INT, 640,\n                     NULL);\n    g_object_set(G_OBJECT(filter2), \"caps\", filtercaps, NULL);\n    gst_caps_unref(filtercaps);\n    filtercaps = gst_caps_new_simple(\"video\/x-h264\",\n                     \"profile\", G_TYPE_STRING, \"high\",\n                     NULL);\n    g_object_set(G_OBJECT(filter3), \"caps\", filtercaps, NULL);\n    gst_caps_unref(filtercaps);\n\n    \/* \u30e1\u30c3\u30bb\u30fc\u30b8\u30cf\u30f3\u30c9\u30e9\u306e\u8a2d\u5b9a *\/\n    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));\n    gst_bus_add_watch(bus, bus_call, loop);\n    gst_object_unref(bus);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u3092\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306b\u8ffd\u52a0 *\/\n    gst_bin_add_many(GST_BIN(pipeline), source, rate, filter1, decode,\n convert, scale, filter2, sink, tee, queue_d, queue_f, encode, filter3,\n parse, mux, filesink, NULL);\n\n    \/* \u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u30ea\u30f3\u30af *\/\n    gst_element_link_many(source, rate, filter1, decode, tee, NULL);\n    gst_element_link_many(tee, queue_d, convert, scale, filter2, sink, NULL);\n    gst_element_link_many(tee, queue_f, encode, filter3, parse, mux, filesink,\n NULL);\n\n    \/* \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u518d\u751f *\/\n    gst_element_set_state (pipeline, GST_STATE_PLAYING);\n\n\n    \/* \u518d\u751f\u4e2d *\/\n    g_print (\"Running...\\n\");\n    g_main_loop_run (loop);\n\n\n    \/* \u7d42\u4e86\u51e6\u7f6e *\/\n    g_print (\"Returned, stopping playback\\n\");\n    gst_element_set_state (pipeline, GST_STATE_NULL);\n\n    g_print (\"Deleting pipeline\\n\");\n    gst_object_unref (GST_OBJECT (pipeline));\n\n    return 0;\n}<\/code><\/p>\n\n\n\n<p>\u3000\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30d3\u30c3\u30c8\u30ec\u30fc\u30c8\u3092\u6307\u5b9a\u3059\u308b\u3068\u3084\u306f\u308a\u5999\u306a\u30ce\u30a4\u30ba\u304c\u5165\u308a\u307e\u3057\u305f\u3002\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3057\u3066\u3082\u5909\u5316\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gstreamer \u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u3044\u3066\u307f\u307e\u3059\u3002 \u3000omxh264enc \u306f\u30d3\u30c3\u30c8\u30ec\u30fc\u30c8\u3092\u6307\u5b9a\u3059\u308b\u3068\u5999\u306a\u30ce\u30a4\u30ba\u304c\u5165\u308a\u307e\u3059\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8a2d\u5b9a\u3067\u306f\u753b\u8cea\u306b\u6e80\u8db3\u3067\u304d\u306a\u3044\u306e\u3067\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3057\u305f\u3068\u304d\u306b\u5909\u5316\u304c\u3042\u308b\u304b\u8a66\u3057\u3066\u307f\u307e\u3059\u3002 vi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-449","post","type-post","status-publish","format-standard","hentry","category-gstreamer"],"_links":{"self":[{"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=449"}],"version-history":[{"count":10,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/449\/revisions"}],"predecessor-version":[{"id":741,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/449\/revisions\/741"}],"wp:attachment":[{"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sirius10.net\/blog\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}