2012-11-21 10 views
9

के साथ एक एमपी 4 वीडियो डीकोड करें मैं जीस्ट्रीमर में एक एमपी 4 वीडियो खेलना चाहता हूं, लेकिन मुझे x264dec के साथ कोई त्रुटि नहीं मिली जो कि नहीं मिला है। मैंने इस पाइपलाइनgstreamer

gst-launch filesrc \ 
    location=/media/thesis/Gstreamer/pub_Irma.mp4 \ 
    ! qtdemux name=demux demux. ! queue ! faad \ 
    ! audioconvert ! audioresample ! autoaudiosink demuxer. \ 
    ! queue ! x264dec ! ffmpegcolorspace ! autovideosink 

इस चरण के बाद, मेरा उद्देश्य एक एमपी 4 वीडियो डिकोडिंग के निष्पादन निशान उत्पन्न करना है। मुझे नहीं पता x264dec के साथ समस्या कहां है।

+0

आप 'नाम = demux' का उपयोग के साथ videoconvert प्रतिस्थापित करने की आवश्यकता है, लेकिन बाद' demuxer। ! ... ', वह' demux.' भी नहीं होना चाहिए? – wimh

+0

@Wimmel आप सही हैं, यह सिर्फ एक टाइपिंग त्रुटि है। X264dec के साथ समस्या हमेशा – KKc

+0

है, इस बारे में मुझे रूचि है कि आप इस निशान में क्या देखेंगे। क्या सभी H264 डिकोडिंग चरणों का पालन करना संभव है? –

उत्तर

4

मुझे नहीं लगता कि x264dec तत्व है (मुझे केवल x264enc तत्व पता है)। आप this nabble post में तरह ffdec_h264 उपयोग कर सकते हैं:

gst-launch-0.10 filesrc location=$1 ! h264parse ! ffdec_h264 ! ffmpegcolorspace ! deinterlace ! xvimagesink 
+0

आपके उत्तर के लिए धन्यवाद, मैंने अंततः इस पाइपली 'GST_DEBUG = qtdemux: 5, faad: 5, ffdec_h264: 5 gst-launch filesrc location =/media/thesis/gstreamer/pub_Irma.mp4 का उपयोग किया था! qtdemux नाम = demuxer demuxer। ! कतार ! फड! audioconvert! ऑडियोएस नमूना! autoaudiosink demuxer। ! कतार ! ffdec_h264! ffmpegcolorspace! autovideosink 2>> (tee /media/thesis/Gstreamer/log_pub.csv) 'निष्पादन ट्रेस प्राप्त करने के लिए। मैंने h264parse – KKc

9

यह आसान हो सकता है:

gst-launch-0.10 playbin2 uri=file:///path/to/foo.mp4 

या

gst-launch-1.0 playbin uri=file:///path/to/foo.mp4 

(आप अभी भी निश्चित रूप से स्थापित आवश्यक तत्वों की जरूरत है)।

+1

के बजाय qtdemux का उपयोग किया था, कभी-कभी लोगों को आरबी और डी करना चाहते हैं, तो playbin2 का उपयोग नहीं करने के लिए बाधा होती है। हमारे शोध को साझा करने के बारे में SO यही है! – user2618142

1

यह आदेश

gst-launch-0.10 filesrc location=/root/gstreamerexamples/big.mp4 ! qtdemux name=demux demux. ! queue ! faad ! audioconvert ! audioresample ! autoaudiosink demux. ! queue ! ffdec_h264 ! ffmpegcolorspace ! autovideosink

मेरे लिए ठीक काम करता है।

mp4 फ़ाइल खेलने के लिए bigBuckBunny mp4 वीडियो को टेस्ट फ़ाइल के रूप में लें। अगला कृपया सुनिश्चित करें कि gst-launch में उल्लिखित सभी तत्व x86 या किसी अन्य लक्ष्य प्लेटफ़ॉर्म में बनाए गए हैं।

कृपया जीस्ट्रीमर की सही स्थापना में बहुत समय भेजें।

+0

इसके बजाय gst-launch-1.0 का उपयोग करें, ffmpegcolorspace के बजाय videoconvert, और ffdec_h264 के बजाय avdec_h264 का उपयोग करें। – Gooshan

1
#include <gst/gst.h> 

    typedef struct _CustomData { 
    GstElement *pipeline; 
    GstElement *source; 
    GstElement *demuxer; 
    GstElement *audioqueue; 
    GstElement *videoqueue; 
    GstElement *audio_decoder; 
    GstElement *video_decoder; 
    GstElement *video_convert; 
    GstElement *audio_convert; 
    GstElement *video_sink; 
    GstElement *audio_sink; 
    } CustomData; 


    static void pad_added_handler (GstElement *src, GstPad *pad, CustomData *data); 

    int main(int argc, char *argv[]) { 
    CustomData data; 
    GstBus *bus; 
    GstMessage *msg; 
    GstStateChangeReturn ret; 
    gboolean terminate = FALSE; 
    /* Initialize GStreamer */ 
    gst_init (&argc, &argv); 
    /* Create the elements */ 
    data.source = gst_element_factory_make ("filesrc", "source"); 
    data.demuxer = gst_element_factory_make ("oggdemux", "demuxer"); 
    data.audioqueue = gst_element_factory_make("queue","audioqueue"); 
    data.videoqueue = gst_element_factory_make("queue","videoqueue"); 
    data.audio_decoder = gst_element_factory_make ("vorbisdec", "audio_decoder"); 
    data.audio_convert = gst_element_factory_make ("audioconvert", "audio_convert"); 
    data.audio_sink = gst_element_factory_make ("autoaudiosink", "audio_sink"); 
    data.video_decoder = gst_element_factory_make("theoradec","video_decoder"); 
    data.video_convert = gst_element_factory_make("ffmpegcolorspace","video_convert"); 
    data.video_sink = gst_element_factory_make("autovideosink","video_sink"); 

    data.pipeline = gst_pipeline_new ("test-pipeline"); 
    if (!data.pipeline || !data.source || !data.demuxer || !data.audioqueue ||!data.audio_decoder ||!data.audio_convert || 
    !data.audio_sink || !data.videoqueue || !data.video_decoder || !data.video_convert || !data.video_sink) { 
    g_printerr ("Not all elements could be created.\n"); 
    return -1; 
    } 

    gst_bin_add_many (GST_BIN (data.pipeline), data.source,data.demuxer,data.audioqueue,data.audio_decoder,data.audio_convert,data.audio_sink,data.videoqueue,data.video_decoder,data.video_convert,data.video_sink, NULL); 

    if (!gst_element_link(data.source,data.demuxer)) { 
    g_printerr ("Elements could not be linked.\n"); 
    gst_object_unref (data.pipeline); 
    return -1; 
    } 

    if (!gst_element_link_many (data.audioqueue,data.audio_decoder,data.audio_convert, data.audio_sink,NULL)) { 
    g_printerr (" audio Elements could not be linked.\n"); 
    gst_object_unref (data.pipeline); 
    return -1; 
    } 
    if (!gst_element_link_many(data.videoqueue,data.video_decoder,data.video_convert, data.video_sink,NULL)) { 
    g_printerr("video Elements could not be linked.\n"); 
    gst_object_unref(data.pipeline); 
    return -1; 
    } 
    /* Set the file to play */ 
    g_object_set (data.source, "location", argv[1], NULL); 

    g_signal_connect (data.demuxer, "pad-added", G_CALLBACK (pad_added_handler), &data); 
    /* Start playing */ 
    ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING); 
    if (ret == GST_STATE_CHANGE_FAILURE) { 
    g_printerr ("Unable to set the pipeline to the playing state.\n"); 
    gst_object_unref (data.pipeline); 
    return -1; 
    } 
    /* Listen to the bus */ 
    bus = gst_element_get_bus (data.pipeline); 
    do { 
    msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, 
    GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS); 

    if (msg != NULL) { 
    GError *err; 
    gchar *debug_info; 
    switch (GST_MESSAGE_TYPE (msg)) { 
    case GST_MESSAGE_ERROR: 
    gst_message_parse_error (msg, &err, &debug_info); 
    g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message); 
    g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none"); 
    g_clear_error (&err); 
    g_free (debug_info); 
    terminate = TRUE; 
    break; 
    case GST_MESSAGE_EOS: 
    g_print ("End-Of-Stream reached.\n"); 
    terminate = TRUE; 
    break; 
    case GST_MESSAGE_STATE_CHANGED: 

    if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) { 
    GstState old_state, new_state, pending_state; 
    gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state); 
    g_print ("Pipeline state changed from %s to %s:\n", 
    gst_element_state_get_name (old_state), gst_element_state_get_name (new_state)); 
    } 
    break; 
    default: 

    g_printerr ("Unexpected message received.\n"); 
    break; 
    } 
    gst_message_unref (msg); 
    } 
    } while (!terminate); 

    gst_object_unref (bus); 
    gst_element_set_state (data.pipeline, GST_STATE_NULL); 
    gst_object_unref (data.pipeline); 
    return 0; 
    } 

    /* This function will be called by the pad-added signal */ 
    static void pad_added_handler (GstElement *src, GstPad *new_pad, CustomData *data) { 
    g_print("Inside the pad_added_handler method \n"); 
    GstPad *sink_pad_audio = gst_element_get_static_pad (data->audioqueue, "sink"); 
    GstPad *sink_pad_video = gst_element_get_static_pad (data->videoqueue, "sink"); 

    GstPadLinkReturn ret; 
    GstCaps *new_pad_caps = NULL; 
    GstStructure *new_pad_struct = NULL; 
    const gchar *new_pad_type = NULL; 
    g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME (new_pad), GST_ELEMENT_NAME (src)); 



    new_pad_caps = gst_pad_get_caps (new_pad); 
    new_pad_struct = gst_caps_get_structure (new_pad_caps, 0); 
    new_pad_type = gst_structure_get_name (new_pad_struct); 


    if (g_str_has_prefix (new_pad_type,"audio/x-vorbis" /*"audio/mpeg"*/)) 
    { 
     ret = gst_pad_link (new_pad, sink_pad_audio); 
     if (GST_PAD_LINK_FAILED (ret)) 
     { 
     g_print (" Type is '%s' but link failed.\n", new_pad_type); 
     } 
     else 
     { 
     g_print (" Link succeeded (type '%s').\n", new_pad_type); 
     } 
    } 



    else if (g_str_has_prefix (new_pad_type, "video/x-theora"/*"video/x-h264"*/)) 
    { 
     ret = gst_pad_link (new_pad, sink_pad_video); 

     if (GST_PAD_LINK_FAILED (ret)) 
     { 
     g_print (" Type is '%s' but link failed.\n", new_pad_type); 
     } 
     else 
     { 
     g_print (" Link succeeded (type '%s').\n", new_pad_type); 
     } 
    } 


    else { 
    g_print (" It has type '%s' which is not raw audio. Ignoring.\n", new_pad_type); 
    goto exit; 
    } 
    exit: 
    if (new_pad_caps != NULL) 
    gst_caps_unref (new_pad_caps); 
    gst_object_unref (sink_pad_audio); 
    gst_object_unref (sink_pad_video); 
    } 
+0

यह ogg फ़ाइलों के लिए है, mp4s – wolfd

2

मेरे पास डेस्कटॉप में फ़ाइल नाम tuhi.mp4 है। तो आदेश इस तरह से चला जाता है।

$ gst-launch-1.0 filesrc location=~/Desktop/tuhi.mp4 ! decodebin name=dec ! videoconvert ! autovideosink dec. ! audioconvert ! audioresample ! alsasink 
+0

नहीं यह पूरी तरह से अब और अब तरीका है। – Gooshan

0

मैं इतना आदेश इस तरह से चला जाता है मेरे डेस्कटॉप में एक ogg फ़ाइल है।

$ gst-launch-1.0 filesrc location=~/Desktop/test.ogg ! oggdemux name=demuxer \ 
    demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \ 
    demuxer. ! queue ! theoradec ! videoconvert ! autovideosink 

यह भी gstreamer 0.10 लेकिन yoy के लिए काम करेंगे ffmpegcolorspace

संबंधित मुद्दे