Bug Report: Unable to Convert H264 Encoded Buffer to MP4 File

Sulthan Amanu sulthan4380 at gmail.com
Wed Oct 4 14:05:23 UTC 2023


Dear Team,

I have encountered an issue while attempting to convert an H264 encoded
buffer to an MP4 file using the appsrc element. Unfortunately, I am unable
to successfully perform this conversion, and I have attached the relevant
pipeline and code snippet for your reference:

*Pipeline:*

gst-launch-1.0 -e v4l2src device="/dev/video0" ! videoconvert ! queue !
x264enc tune=zerolatency ! identity ! fakesink


I'm utilizing the `identity` element to capture the buffers and store them
in a buffer list. Subsequently, I am using the following code snippet to
convert the H264 encoded buffer to an MP4 file:

*Code Snippet:*

void convertToMP4(GstBufferList *buflist)
{
    // Create pipeline for MP4 conversion.
    GstElement *pipeline, *appsrc, *videoconvert, *x264enc, *h264parse,
*videoencode, *muxer, *file_sink;
    pipeline = gst_pipeline_new("MP4-pipeline");
    appsrc = gst_element_factory_make("appsrc", "source");
    h264parse = gst_element_factory_make("h264parse", "app-h264parse");
    muxer = gst_element_factory_make("mp4mux", "mux");
    file_sink = gst_element_factory_make("filesink", "filesink");

    g_object_set(G_OBJECT(appsrc),
                 "stream-type", 0,
                 "format", GST_FORMAT_TIME, NULL);

    g_object_set(muxer, "fragment-duration", 2000, NULL);
    // g_object_set(h264parse, "config-interval", -1, NULL);
    // g_object_set(x264enc, "tune", 4, NULL);

    // Set the resolution and framerate caps
    GstCaps *caps = gst_caps_new_simple("video/x-h264",
                                        "stream-format", G_TYPE_STRING,
"byte-stream",
                                        "width", G_TYPE_INT, 1280,
                                        "height", G_TYPE_INT, 720,
                                        "framerate", GST_TYPE_FRACTION, 10,
1,
                                        NULL);

    gst_app_src_set_caps(GST_APP_SRC(appsrc), caps);

    gst_caps_unref(caps);

    g_object_set(file_sink, "location", "DIA_VIDEO_AUDIO.mp4", NULL);

    gst_bin_add_many(GST_BIN(pipeline), appsrc, h264parse, muxer,
file_sink, NULL);
    if (gst_element_link_many(appsrc, h264parse, muxer, file_sink, NULL) !=
TRUE)
    {
        g_printerr("Elements could not be linked in the pipeline.\n");
        gst_object_unref(pipeline);
        exit(1);
    }

    copy_buflist = gst_buffer_list_copy_deep(buflist);
    g_print("isbuffered is filled and Buffer size is %d\n",
gst_buffer_list_length(copy_buflist));
    // Set the pipeline to the PLAYING state.
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    // Push video and audio buffers into appsrc.
    GstFlowReturn retval =
gst_app_src_push_buffer_list(GST_APP_SRC(appsrc), copy_buflist);
    if (retval != GST_FLOW_OK) {
        g_printerr("Error pushing buffers to appsrc: %s\n",
gst_flow_get_name(retval));
        // Handle error and cleanup if needed.
    }

    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
    gst_bus_add_signal_watch(bus);
    g_signal_connect(bus, "message::error", G_CALLBACK(cb_message_error),
NULL);
    g_signal_connect(bus, "message::eos", G_CALLBACK(cb_message_eos), NULL);
}

However, I am encountering the following error:


*ERROR*

is buffered is filled, and the Buffer size is 70

MP4 converted /n0:00:08.391637077 18811 0x7fcd6c0040f0 FIXME default
gstutils.c:3981:gst_pad_create_stream_id_internal:<source:src> Creating a
random stream-id; consider implementing a deterministic way of creating a
stream-id

I kindly request your assistance in resolving this issue promptly. Your
guidance in rectifying this problem will be greatly appreciated.

Best Regards,
Sulthan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20231004/f3757c89/attachment.htm>


More information about the gstreamer-devel mailing list