GStreamer рдкрд░ рд╕рд░рд▓ рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреЗ рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореИрдВрдиреЗ, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, Gstreamer рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЪреБрдирд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдкрд╣рд▓реЗ, рдЖрдЗрдП Gstreamer рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ

рддрддреНрд╡ - рдпрд╣ Gstreamer рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рддрдерд╛рдХрдерд┐рдд рдЪреИрдирд▓ (рдкрд╛рдЗрдкрд▓рд╛рдЗрди) рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛, рдЗрдирдкреБрдЯ рдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдЖрджрд┐ред

рд╕реЙрдХреЗрдЯреНрд╕ (рдкреИрдб) - рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдШреЛрдВрд╕рд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рддрддреНрд╡ рдХрдВрдЯреЗрдирд░ (рдмрд┐рди) - рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдбрд┐рдмреНрдмреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рддрддреНрд╡ рдХрдВрдЯреЗрдирд░ рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдпрд╣ рд╣рдорд╛рд░реЗ рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХрд╛ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

audioengine.h
#ifndef AUDIOENGINE_H #define AUDIOENGINE_H #include <gst/gst.h> #include <glib.h> #include <QObject> class AudioEngine : public QObject { Q_OBJECT public: AudioEngine(QObject *parent = 0); ~AudioEngine(); int Init(); void MusicPlay(); void MusicPaused(); void MusicStop(); void AddFile(char *file); void SetVolume(gdouble val); gint64 GetMusicPosition(); gint64 GetMusicDuration(); void SetMusicPosition(gint64 pos); private: GstElement *pipeline; GstElement *source; GstElement *volume; gint64 pos; static void OnPadAdded(GstElement *element, GstPad *pad, gpointer data); private slots: }; #endif // AUDIOENGINE_H 



Init () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо Gstreamer рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ:

 gst_init(0, 0); 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди argv рдФрд░ argc рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рдПрдХ рдЪреИрдирд▓ рдмрдирд╛рдПрдВ:

 pipeline = gst_pipeline_new("audio-player"); 

рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡:

 source = gst_element_factory_make("filesrc", NULL); demuxer = gst_element_factory_make("decodebin", NULL); decoder = gst_element_factory_make("audioconvert", NULL); volume = gst_element_factory_make("volume", NULL); conv = gst_element_factory_make("audioconvert", NULL); sink = gst_element_factory_make("autoaudiosink", NULL); 

рддрддреНрд╡ рд╕реНрд░реЛрдд - рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред
demuxer - рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбрд┐рдХреЛрдбрд░ рдФрд░ рдХрдирд╡ - рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╛рдЗрд▓ рдХреЛ рджреВрд╕рд░реЗ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╡реЙрд▓реНрдпреВрдо - рдзреНрд╡рдирд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред
sinc - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИ ...

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдореВрдХреНрд╕рд░ рдзрд╛рд░рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдбреАрдХреЛрдбрд░ рдХреЗ рд╕рд╛рде рдбреАрдХреЛрдбрд░ рдХреЛ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред OnPadAdded () рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 g_signal_connect(demuxer, "pad-added", G_CALLBACK(OnPadAdded), decoder); 

рд╕рднреА рдмрдирд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЛ рдЪреИрдирд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 gst_bin_add_many (GST_BIN (pipeline), source, demuxer, decoder, volume, conv, sink, NULL); 

рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ред

 gst_element_link (source, demuxer); gst_element_link_many (decoder, volume, conv, sink, NULL); 

рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 void AudioEngine::AddFile(char *file) { g_object_set(G_OBJECT(source), "location", file, NULL); } 

G_object_set () рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕реНрдерд╛рди рддрд░реНрдХ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рд╣реИ, рдлрд╝рд╛рдЗрд▓ рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╣реИред рдЕрдВрддрд┐рдо NULL рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рддрддреНрд╡ рдХреЛ рдЕрдм рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреНрд▓реЗрдмреИрдХ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:

 void AudioEngine::AddFile(char *file) { g_object_set(G_OBJECT(source), "location", file, NULL); } void AudioEngine::MusicPlay() { gst_element_set_state(pipeline, GST_STATE_PLAYING); } void AudioEngine::MusicPaused() { gst_element_set_state(pipeline, GST_STATE_PAUSED); } 

рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд╡реЙрд▓реНрдпреВрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:

 void AudioEngine::SetVolume(gdouble val) { g_object_set(G_OBJECT(volume), "volume", val, NULL); } 

рдЯреНрд░реИрдХ рдХреА рдЕрд╡рдзрд┐ рдФрд░ рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:

 gint64 AudioEngine::GetMusicDuration() { gint64 len; gst_element_query_duration(pipeline, GST_FORMAT_TIME, &len); return len; } gint64 AudioEngine::GetMusicPosition() { gint64 pos; gst_element_query_position(pipeline, GST_FORMAT_TIME, &pos); return pos; } 

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЯреНрд░реИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:

 void AudioEngine::SetMusicPosition(gint64 pos) { gst_element_set_state(pipeline, GST_STATE_PAUSED); gst_element_seek_simple(pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, pos); gst_element_set_state(pipeline, GST_STATE_PLAYING); } 

рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд▓реЗрдмреИрдХ рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
gst_element_seek_simple () рд╣рдорд╛рд░реЗ рдЪреИрдирд▓, рд╕рдордп рдкреНрд░рд╛рд░реВрдк, рд╕реНрдерд┐рддрд┐ рдЦреЛрдЬ рдзреНрд╡рдЬ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣реА рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреВрд░реНрдг рдХреЛрдб Qt рдкрд░ рд▓рд╛рдЧреВ рдПрдХ рдЫреЛрдЯреЗ рдЬреАрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдкрд░ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЧреАрддрд╛рдм рд╕реВрддреНрд░

рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In204172/


All Articles