Re: Data loss in Buffer to mp4 file conversion

Sulthan Amanu via gstreamer-devel <[email protected]>
Newsgroups gmane.comp.video.gstreamer.devel
Message-ID <CACnfP3XF+iBZdSyQe_1LqxAi-aVyJ7rF+hG9smvtt2UA5HOpjA@mail.gmail.com>
Please reply to my query, I am waiting for your reply at long time

Regards,
Sulthan

On Mon, Sep 11, 2023, 00:25 Sulthan Amanu <[email protected]> wrote:

> Any update regarding to my query ?
>
> On Wed, Sep 6, 2023, 20:54 Sulthan Amanu <[email protected]> wrote:
>
>> Hi Team,
>>
>> I'm attempting to convert a raw buffer into an MP4 format using an
>> appsrc. However, I encountered a problem with frame loss during the
>> conversion of a list of buffers. For instance, I have a list of 150 frames
>> with a frame rate of 10 frames per second (fps), but the resulting MP4 file
>> only contains 13 seconds of video. This means that 2 seconds worth of
>> frames (20 frames) have been lost during the conversion process. Below,
>> you'll find the code for my conversion logic:
>>
>> CODE:
>>
>> void convertToMP4(GstBufferList *buflist)
>> {
>>     // Create pipeline for MP4 conversion.
>>     GstElement *pipeline, *appsrc, *videoconvert, *videoencode, *muxer,
>> *file_sink;
>>     guint64 timestamp_ns = 0; // Initialize with zero or the desired
>> start time in nanoseconds
>>     guint frame_duration_ns = GST_SECOND / 10; // 10 frames per second
>> (10 FPS)
>>     pipeline = gst_pipeline_new("MP4-pipeline");
>>     appsrc = gst_element_factory_make("appsrc", "source");
>>     file_sink = gst_element_factory_make("filesink", "filesink");
>>
>>     g_object_set(G_OBJECT(appsrc),
>>                  "stream-type", 0,
>>                  "format", GST_FORMAT_TIME, NULL);
>>
>>     // Set the resolution and framerate caps
>>     // GstCaps *caps = gst_caps_new_simple("video/x-raw",
>>     //     "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.mp4", NULL);
>>
>>     gst_bin_add_many(GST_BIN(pipeline), appsrc, file_sink, NULL);
>>     if (gst_element_link_many(appsrc, 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));
>>     gst_element_set_state(pipeline, GST_STATE_PLAYING);
>>
>>     for (int frame_number = 0; frame_number <
>> gst_buffer_list_length(copy_buflist); frame_number++) {
>>          GstBuffer *buffer = gst_buffer_list_get(copy_buflist,
>> frame_number);
>>
>>         // Set the timestamp for the buffer
>>         GST_BUFFER_TIMESTAMP(buffer) = timestamp_ns;
>>
>>         // Increment the timestamp for the next frame
>>         timestamp_ns += frame_duration_ns;
>>
>>         // Push the buffer into the pipeline
>>         gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer);
>>     }
>>
>>    // retval = gst_app_src_push_buffer_list(GST_APP_SRC(appsrc),
>> copy_buflist);
>>     g_print("RETVAL %d\n", retval);
>>     g_print("Sending EOS!!!!!!!");
>>     g_signal_emit_by_name(appsrc, "end-of-stream", &retval);
>> }
>>
>> Can you please provide a solution on my problem.
>>
>> Regards,
>>
>> Sulthan
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.