为什么gstreamer会给出rtsp无效的URI错误?

问题描述

我一直在尝试用gstreamer编写rtsp播放器。我正在使用Windows 10 pc。

我希望该播放器支持反向播放。当我开始编写代码时,gstreamer版本为1.14.5。但是,在此版本中,我发现rtspsrc不支持反向播放,并且此功能在1.15.2版中提供。当我编写代码时,除反向播放外,所有功能(开始,暂停,停止,快进)均正常工作。

但是,当我切换到1.15.2版时,我开始收到“无效的URI”错误,甚至没有尝试发送请求(我已通过Wireshark检查)。我检查过的所有地方都说要关闭代理,但是我从Windows设置中关闭了代理,但仍然无法正常工作。

初始化gstreamer。

IGSPlayer::GSPlayer_ERROR Player::initialize_player(int argc,char* argv[]) {
gst_init(&argc,&argv);
GstElement *rtspsrc_element,*rtph264depay_element,*h264parse_element,*avdec_h264_element,*videoconvert_element,*glimagesink_element;
rtspsrc_element = gst_element_factory_make("rtspsrc","rtspsrc");
if (!rtspsrc_element) {
    std::cout << "Unable to create rtspsrc!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_RTSPSRC;
}
rtph264depay_element = gst_element_factory_make("rtph264depay","rtph264depay");
if (!rtph264depay_element) {
    std::cout << "Unable to create rtph264depay_element!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_DEPAY;
}
h264parse_element = gst_element_factory_make("h264parse","h264parse");
if (!h264parse_element) {
    std::cout << "Unable to create h264parse_element!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_PARSE;
}
avdec_h264_element = gst_element_factory_make("avdec_h264","avdec_h264");
if (!avdec_h264_element) {
    std::cout << "Unable to create avdec_h264_element!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_AVDEC;
}
videoconvert_element = gst_element_factory_make("videoconvert","videoconvert");
if (!videoconvert_element) {
    std::cout << "Unable to create vidoeconvert_element!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_CONVERT;
}
glimagesink_element = gst_element_factory_make("glimagesink","glimagesink");
if (!glimagesink_element) {
    std::cout << "Unable to create glimagesink_element!" << std::endl;
    return IGSPlayer::CREATE_ELEMENT_ERROR_SINK;
}

setLoop(g_main_loop_new(NULL,FALSE));

g_object_set(rtspsrc_element,"location",get_rtsp_uri().c_str(),NULL);
g_object_set(rtspsrc_element,"latency",NULL);

setVideosink(glimagesink_element);

setPipeline(gst_pipeline_new("rtsp-pipeline"));
if (!getPipeline()) {
    std::cerr << "pipeline Could not be created!" << std::endl;
    return IGSPlayer::CREATE_PIPELINE_ERROR;
}

setBus(gst_pipeline_get_bus(GST_PIPELINE(getPipeline())));
gst_bus_add_watch(getBus(),bus_call,this);
gst_object_unref(getBus());

gst_bin_add_many(GST_BIN(getPipeline()),rtspsrc_element,rtph264depay_element,NULL);
g_signal_connect(rtspsrc_element,"pad-added",G_CALLBACK(new_rtspsrc_pad),rtph264depay_element);
gst_bin_add_many(GST_BIN(getPipeline()),h264parse_element,NULL);
if (!gst_element_link(rtph264depay_element,h264parse_element)) {
    std::cout << "rtph264depay -> h264parse not be linked!" << std::endl;
    gst_object_unref(getPipeline());
    return IGSPlayer::LINKED_ERROR;
}
gst_bin_add_many(GST_BIN(getPipeline()),avdec_h264_element,videoconvert_element,glimagesink_element,NULL);

/* link the elements together */
if (!gst_element_link_many(h264parse_element,NULL)) {
    std::cerr << "Elements Could not be linked!" << std::endl;
    gst_object_unref(getPipeline());
    return IGSPlayer::LINKED_ERROR;
}

gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(glimagesink_element),(guintptr) get_window_id());

setEndOfStream(false);
return IGSPlayer::SUCCESS;}

玩。

IGSPlayer::GSPlayer_ERROR Player::play_stream() {
    GstStateChangeReturn ret = gst_element_set_state(getPipeline(),GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE) {
        gst_element_set_state(getPipeline(),GST_STATE_NULL);
        gst_object_unref(GST_OBJECT(getPipeline()));
        return IGSPlayer::GSPlayer_ERROR::STATE_CHANGE_ERROR;
    }
    setPlaying(TRUE);
    setRate(1.0);

    g_main_loop_run(getLoop());

    return IGSPlayer::SUCCESS;}

我也尝试在Windows Powershell上使用gst-launch-1.0,但是它也不起作用。我很想听到任何想法为什么这不起作用。

解决方法

Okey,我找到了解决方案。我在Windows上使用了非英语选项。当我选择英语的语言选项时,该问题已解决。