<div dir="ltr">I have a gstreamer pipeline which basically incorporates a GESTimeline, two encoders (audio and video), a muxer, and a filesink.<div><br></div><div>When I run the pipeline, I periodically query the stream position (as shown in code below) and print into the terminal (stdout).<div><br></div><div>The problem is: When I run the pipeline, the terminal says that I have reached 100% relatively early (within 2 seconds), but the pipeline itself continues to run for 10 more seconds. When the terminal reports being 100% done, I can see that the target mp4 file (the final output of the pipeline) is less than 5% of it's final size.</div></div><div><br></div><div>
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">My goal is to get an accurate indication of the job's progress as it runs</span>
</div><div><br></div><div>Other things I've tried.<br></div><div><ul><li>Tried listening for GST_MESSAGE_PROGRESS messages, but I don't get any.</li><li>Tried executing `gst_element_query_position` on the filesink (the last element of the pipeline), instead of the entire pipeline itself, but my results did not change.</li></ul>
</div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">The code for my main loop is shown below. The progress printing occurs near the very bottom of the loop.</span><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="text-align:start;text-indent:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><font face="monospace, monospace"><div> /// Run the job. Will throw exception if unsuccessful.</div><div> void CompositionJob::run()</div><div> {</div><div> GstStateChangeReturn stateChangeReturn;</div><div> </div><div> // Start playing the pipeline.</div><div> stateChangeReturn = gst_element_set_state(reinterpret_cast<GstElement*>(this->gstPipeline), GST_STATE_PLAYING);</div><div> if (stateChangeReturn == GST_STATE_CHANGE_FAILURE)</div><div> throw std::runtime_error("Unable to set the pipeline to the playing state.");</div><div><br></div><div> // Talk to the message bus</div><div> this->gstBus = gst_element_get_bus(reinterpret_cast<GstElement*>(this->gstPipeline));</div><div> unique_gmob<GstMessage> gstMessage = nullptr;</div><div> </div><div> this->shouldTerminate = false;</div><div> while (!this->shouldTerminate)</div><div> {</div><div> gstMessage = gst_bus_timed_pop_filtered(this->gstBus, 100 * GST_MSECOND,</div><div> (GstMessageType)(GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_DURATION));</div><div><br></div><div> if (gstMessage)</div><div> {</div><div> this->handleMessage(gstMessage.get());</div><div> gstMessage.reset();</div><div> }</div><div> else</div><div> {</div><div> // If we got no message, a timeout period has expired.</div><div> if (this->isPlaying)</div><div> {</div><div> // Query the stream position (in nanoseconds).</div><div> if (!gst_element_query_position(</div><div> reinterpret_cast<GstElement*>(this->gstPipeline),</div><div> GST_FORMAT_TIME,</div><div> &this->streamPosition))</div><div> GST_DEBUG("Could not query current position.");</div><div><br></div><div> // Query the duration if we don't have it already.</div><div> if (!GST_CLOCK_TIME_IS_VALID(this->streamDuration))</div><div> {</div><div> if (!gst_element_query_duration(</div><div> reinterpret_cast<GstElement*>(this->gstPipeline),</div><div> GST_FORMAT_TIME,</div><div> &this->streamDuration))</div><div> GST_DEBUG("Could not get pipeline duration.");</div><div> }</div><div><br></div><div> // Print position and duration.</div><div> if (this->printProgress)</div><div> {</div><div> g_print("Position %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",</div><div> GST_TIME_ARGS(this->streamPosition), GST_TIME_ARGS(this->streamDuration));</div><div> }</div><div> }</div><div> }</div><div> }</div><div> }</div></font></span></div></div>