Gstreamer HLS管道创建错误

时间:2014-08-13 14:25:38

标签: c gstreamer ubuntu-14.04

我正在尝试使用gstreamer 1.0流式传输HLS流。我有一个可以使用的过滤器

gst-launch-1.0 -v souphttpsrc location="http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8" ! hlsdemux ! tsdemux ! h264parse ! avdec_h264 ! autovideosink

但是当我尝试将其转换为c代码时,它会失败。

int main(int argc, char* argv[])
{
    GMainLoop *loop;
    GstElement *pipeline, *source, *demuxer, *tsdemux, *h264parse, *vdecoder, *vsink;
    GstElement *aacparse, *adecoder, *aconvert, *asink;
    GstBus *bus;
    int bus_watch_id;

    gst_debug_set_default_threshold(3);
    gst_init(&argc, &argv);
    loop = g_main_loop_new(NULL, FALSE);

    if (argc != 2)
    {
       g_printerr("Usage: %s <http stream source>\n", argv[0]);
       return -1;
    } 

    pipeline = gst_pipeline_new("myApp");
    source = gst_element_factory_make("souphttpsrc", "http-src");
    demuxer = gst_element_factory_make("hlsdemux", "hls-demuxer");
    tsdemux = gst_element_factory_make("tsdemux", "ts-demuxer");
    h264parse = gst_element_factory_make("h264parse", "h264parse");
    vdecoder = gst_element_factory_make("avdec_h264", "h264decoder");
    vsink = gst_element_factory_make("autovideosink", "videosink");


    /* set the input url to the source element */
    g_object_set(G_OBJECT(source), "location", argv[1], NULL);

    bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline));
    bus_watch_id = gst_bus_add_watch(bus, bus_call, loop);
    gst_object_unref(bus);

    /* add elements into the pipeline */ //next aacparse
    gst_bin_add_many(GST_BIN (pipeline), source, demuxer, tsdemux, h264parse, vdecoder,vsink,  NULL);

    gst_element_link(source, demuxer);
    // this was wrong
    /*gst_element_link_many(tsdemux, h264parse, vdecoder, vsink, NULL);*/


    /* connect demuxer and decoder on pad added */
    /*g_signal_connect(demuxer, "pad-added", G_CALLBACK(on_pad_added), vdecoder);*/

    // Correct Implementation
    gst_element_link_many(h264parse, vdecoder, vsink, NULL);

    g_signal_connect(demuxer, "pad-added", G_CALLBACK(on_pad_added), tsdemux);
    g_signal_connect(tsdemux, "pad-added", G_CALLBACK(on_pad_added), h264parse);
    g_signal_connect(demuxer, "pad-added", G_CALLBACK(on_pad_added), vdecoder);
    // Correct Implementation

    g_print ("Starting play: %s\n", argv[1]);
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_print ("Running\n");
    g_main_loop_run(loop);

    /* Clean up after execution of main loop */
    g_print ("Stopping Playback: %s\n", argv[1]);
    gst_element_set_state(pipeline, GST_STATE_NULL);

    g_print ("Quitting\n");
    g_object_unref(G_OBJECT(pipeline));
    g_source_remove(bus_watch_id);

    g_main_loop_unref(loop);

    return 0;
}

我使用以下代码编译代码:

cc my_app.c -o my_app $(pkg-config --cflags --libs gstreamer-1.0)

使用以下命令启动应用程序:

./my_app http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

我总是收到以下错误:

hlsdemux gsthlsdemux.c:792:gst_hls_demux_stream_loop:<hls-demuxer> error: stream stopped, reason not-negotiated

我是否必须做不同的事情?

2 个答案:

答案 0 :(得分:1)

// this was wrong
gst_element_link(source, demuxer);
// Correct Implementation
gst_element_link(source, demuxer,NULL);

你的空虚在哪里 on_pad_added(GstElement *元素,               GstPad *垫,               gpointer数据);功能?
并查看here

答案 1 :(得分:0)

我能够让它运转起来。问题是“tsdemux”和“demuxer”必须在运行时以“on_pad_added”方法连接。