我通过连接和断开分支来控制视频录制,但小概率appsrc会拒绝数据,无法继续工作。我不知道是什么原因造成的。告诉我您是否有解决方案或其他控制方法? 这是管道:
这是控制视频的功能:
void GstHandle::startRecord(QString path)
{
if(mIsRecording){
log_info("%s : GST current record is already open", __func__);
return;
}
record_start = QDateTime::currentMSecsSinceEpoch();
mRecordQueue = gst_element_factory_make("queue", "record_queue");
mH264Parse = gst_element_factory_make("h264parse", "myparse");
mQtMux = gst_element_factory_make("qtmux", "qtmux");
mFileSink = gst_element_factory_make("filesink", "filesink");
if(!mFileSink || !mRecordQueue || !mQtMux || !mH264Parse){
log_error("%s : GST create elements error", __func__);
return;
}
g_object_set (mFileSink, "location", path.toLocal8Bit().data(), NULL);
gst_bin_add_many(GST_BIN(mPipeline), mRecordQueue, mH264Parse, mQtMux, mFileSink, NULL);
gst_element_sync_state_with_parent(mFileSink);
gst_element_sync_state_with_parent(mQtMux);
gst_element_sync_state_with_parent(mH264Parse);
gst_element_sync_state_with_parent(mRecordQueue);
if(gst_element_link_many(mRecordQueue, mH264Parse, mQtMux, mFileSink, NULL) != TRUE)
{
log_error("%s : GST video queue link error", __func__);
}
gst_element_sync_state_with_parent(mRecordQueue);
//set pads
tee_record_pad = gst_element_get_request_pad(mTee, "src_2");
record_sink_pad = gst_element_get_static_pad(mRecordQueue, "sink");
if(!tee_record_pad || !record_sink_pad){
log_error("%s : GST get pads error", __func__);
return;
}
GstPadLinkReturn ret = GST_PAD_LINK_OK;
if(!gst_pad_is_linked(record_sink_pad)){
ret = gst_pad_link(tee_record_pad, record_sink_pad);
if(ret != GST_PAD_LINK_OK)
{
log_error("%s : GST pad link error", __func__);
gst_object_unref(record_sink_pad);
return;
}
}
gst_object_unref(record_sink_pad);
if(gst_element_set_state(mPipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
{
log_error("%s : GST Unable to set the pipeline to playing state!", __func__);
}
mIsRecording = true;
log_info("%s : GST start record, save %s", __func__, path.toLocal8Bit().data());
}
void GstHandle::stopRecord()
{
if(!mIsRecording){
return;
}
if(gst_element_send_event(mQtMux, gst_event_new_eos()) != TRUE){
log_error("%s : GST send eos to qtmux error, may mp4 cannot play", __func__);
}
gst_element_set_state(mRecordQueue, GST_STATE_NULL);
gst_element_set_state(mH264Parse, GST_STATE_NULL);
gst_element_set_state(mQtMux, GST_STATE_NULL);
gst_element_set_state(mFileSink, GST_STATE_NULL);
record_sink_pad = gst_element_get_static_pad(mRecordQueue, "sink");
if(gst_pad_is_linked(record_sink_pad))
gst_pad_unlink(tee_record_pad, record_sink_pad);
gst_bin_remove(GST_BIN(mPipeline), mFileSink);
gst_bin_remove(GST_BIN(mPipeline), mQtMux);
gst_bin_remove(GST_BIN(mPipeline), mH264Parse);
gst_bin_remove(GST_BIN(mPipeline), mRecordQueue);
gst_object_unref(record_sink_pad);
gst_element_release_request_pad(mTee, tee_record_pad);
gst_object_unref(tee_record_pad);
mIsRecording = false;
log_info("%s : GST stop record", __func__);
}
无法稳定重现,请问有哪些可能的情况或者如何优化这个功能。非常感谢!
是否有机会从多线程访问停止/启动记录?如果是这样,它似乎不是线程安全的。 “mIsRecording”定义不在您的代码片段中。
我也遇到同样的问题