当前位置:文档之家› 一步一步创建GStreamer插件(ZZ)

一步一步创建GStreamer插件(ZZ)

一步一步创建GStreamer插件(ZZ)$git clonegit:///gstreamer/gst-template.git2、进入目录gst-template/gst-plugin/src$cdgst-template/gst-plugin/src$../tools/make_elementExampleFilter产生文件gstexamplefilter.c gstexamplefilter.h3、修改Makefile.am文件(注意:是src目录下的Makefile.am)$sudo geditMakefile.amplugin_LTLIBRARIES = libgstexamplefilter_la_SOURCES = gstexamplefilter.clibgstexamplefilter_la_CFLAGS = $(GST_CFLAGS)libgstexamplefilter_la_LIBADD = $(GST_LIBS)libgstexamplefilter_la_LDFLAGS =$(GST_PLUGIN_LDFLAGS)libgstexamplefilter_la_LIBTOOLFLAGS =--tag=disable-staticnoinst_HEADERS = gstexamplefilter.h总共有七行4、导入PKG_CONFIG_PATH环境变量,在命令行输入:$exportPKG_CONFIG_PATH=/usr/lib/pkgconfig5、进入目录gst-template/gst-plugin,修改文件autogen.sh进入上一层目录$cd..编辑autogen.sh文件:$sudo geditautogen.sh如果是通过CVS获取的模板,则修改原来的srcfile=src/main.c为新的:srcfile=src/gstexamplefilter.c如果是通过GIT获取的模板,则在autogen.sh的开始添加:srcfile=src/gstexamplefilter.c6、运行autogen.sh,产生Makefile 文件$./autogen.sh7、开始安装:$./configure$make$sudo makeinstall再进入src子目录中$cd src用ls -a查询会有.libs目录产生(注意:.libs 为隐藏目录)进入.libs$cd .libs$ls -a会发现里面产生了libgstexamplefilter.so8、将插件加入到gstreamer库中把libgstexamplefilter.so这两个文件拷贝到系统目录中:/usr/lib/gstreamer-0.10$sudo cp /usr/lib/gstreamer-0.10/$sudo cp libgstexamplefilter.so/usr/lib/gstreamer-0.10/libgstexamplefilter.so如果gstreamer无法扫描到新加入的plugin,可能是因为路径设置不正确(GST_PLUGIN_PATH环境变量)用gst-inspect命令来查看plugin时,会建立一个cache文件:如在X86上是$HOME/.gstreamer-0.10/registry.x86_64.bin如果有新的plugin加入,可能需要先删除这个cache文件,再重新运行gst-inspect,否则不会把新的plugin扫描到cache中。

几个重要的环境变量:1:GST_PLUGIN_SCANNERenv = g_getenv("GST_PLUGIN_SCANNER");//设置gst-plugin_scanner这个命令的路径 2.GST_PLUGIN_PATHplugin_path = g_getenv ("GST_PLUGIN_PATH");//plugin的搜索路径g_warning ("External plugin loader failed. Thismost likely means that ""the plugin loader helper binary was not found or could not be run.""%s", (g_getenv ("GST_PLUGIN_PATH") != NULL) ?"If you are running an uninstalled GStreamer setup, you might need""to update your gst-uninstalled script so that the ""GST_PLUGIN_SCANNER environment variable gets set." : "");3.GST_PLUGIN_SYSTEM_PATHGST_PLUGIN_SYSTEM_PATH specifies a list of plugins that are alwaysloaded by default. If not set, this defaults tothe system-installedpath,and the plugins installed in the user's home directoryplugin_path = g_getenv("GST_PLUGIN_SYSTEM_PATH"); 如果这个变量没有设置,default:plugin_path = g_getenv("GST_PLUGIN_SYSTEM_PATH");if (plugin_path == NULL){home_plugins= g_build_filename (g_get_home_dir (),".gstreamer-" GST_MAJORMINOR, "plugins", NULL);} 4. GST_REGISTRY_UPDATE(yes or no),是否重新扫描去更新cache内容update_env = g_getenv("GST_REGISTRY_UPDATE")do_update =(strcmp (update_env, "no") != 0) 函数调用:init_post()->gst_update_registry()->ensure_current_regist ry()->gst_registry_binary_read_cache->scan_and_update_registry()->读环境变量GST_PLUGIN_PATH->gst_registry_scan_path_internal()->读环境变量GST_PLUGIN_SYSTEM_PATH->gst_registry_scan_path_internal() (从目录下去读文件)检查插件:$gst-inspect examplefilter如果显示了插件的信息,那么插件就创建好了(2) Gst good/ugly/bad库中的plugin的列表/documentation/plugins.html关于whitelist和blacklist(黑名单)在plugin库中,有些plugin的license是blacklist的:if (strcmp (plugin->desc.license, "BLACKLIST") ==0)plugin->flags |= GST_PLUGIN_FLAG_BLACKLISTED; 但是BLACKLIST并不是开放给用户设置的,而是gstreamer 里面自己使用的。

含义是说如果这个plugin加载失败时,那么就加入到blacklist中,下次不需要去扫描了,用户也不能去使用。

这种plugin在scan时会进入blacklist的pluginlist中,在下次扫描时不会去扫描这些blacklist。

exchange_packets()->read_one()->handle_rx_packet(payloadLength)->plugin_loader_create_bl acklist_plugin()代码:if (entry != NULL) {plugin_loader_create_blacklist_plugin (l,entry);//plugin->desc.license = "BLACKLIST";l->got_plugin_details = TRUE;}如果要查看为什么加载plugin会失败:https:///show_bug.cgi?id=627102plugins are blacklisted when there's an error loading them. Youcancheck what went wrong by removing your registry(~/.gstreamer-0.10/registry*) and then running:GST_DEBUG=2,GST_PLUGIN_LOADING:5,GST_REGISTR Y:5gst-inspect-0.10上面这些参数是设置debug系统:_gst_debug_init()(3) Gstreamer中的几个命令使用/library/cmd/blcmdl1_gst-inspect.htm/man/man1/gst-inspect.html gst-inspect: gst-inspect prints information about available GStreamerplugins, information about a particular plugin, or information about a particular element.If no element or plugin argument is specified,gst-inspect prints a list of all plugins and elements. If an element or plugin argument is specified,gst-inspect prints information about that element orplug-in. If a given argument is valid as either an element or a plugin, gst-inspect treats the argument as an element, by default.OPTIONSThe following options are supported by gst-inspect:-a, --print-all Print all elements.--version Print GStreamer version number.gst-std-options Standard options available for use withmost GStreamer applications. See gst-std-options(5) for more information.OPERANDSThe following operands are supported:element Name of an element.plugin Name of a plugin.EXAMPLESExample 1: Displaying Information About a Plugin: example% gst-inspect alawPlugin Details:Name: alawDescription: ALaw audio conversion routines Filename: /usr/lib/gstreamer-0.10/libgstalaw.so Version: 0.10.3License: LGPLSource module: gst-plugins-goodBinary package: GStreamer Good Plug-ins source releaseOrigin URL: Unknown package origin alawdec: A Law audio decoderalawenc: A Law audio encoder 2 features:+-- 2 elementsgst-launch:gst-launch builds and runs basic GStreamer pipelines.In simple form, a pipeline-description is a list ofelements separated by exclamation marks (!). Properties can be appended to elements, in the form property=value.For a complete description of possible values forpipeline-description, see the section Pipeline Description below or consult the GStreamer documentation.Please note that gst-launch is primarily a debugging toolfor developers and users. You should not build applications on topof it. For applications, use the gst_parse_launch() function of the GStreamer API as an easy way to construct pipelines from pipelinedescriptions.OPTIONSThe following options are supported by gst-launch:-X,--exclude=type1,type2,... Do not outputstatus information of specified type.-f, --no-fault Do not install a faulthandler.-o, -output-=file Save XMLrepresentation of pipeline to file, then exit.-t, --tags Output tags, also known asmetadata.-T, --trace Print memory allocation trace,if enabled at compile time.-v, --verbose Output status information andproperty notifications.--version Print GStreamer version number.gst-std-options Standard options available for use withmost GStreamer applications. See gst-std-options(5) for more information.EXTENDED DESCRIPTIONPipelineDescriptionA pipeline consists elements and links. Elements can be put into bins of different sorts. Elements, links and bins can be specified in a pipeline description in any order.Elementselementtype [property1 ...]Creates an element of type elementtype and sets the properties.Propertiesproperty=value ...Sets the property to the specified value. You can usegst-inspect(1) to find out about properties and allowed values of different elements.Enumeration properties can be set by name, nick or value.Bins[bintype.] ( [property1 ...] pipeline-description )Specifies that a bin of type bintype is created and thegiven properties are set. Every element between the braces is put into the bin. Please note the dot that has to be used after the bintype. You will almost never need this functionality, itis only really useful for applications using thegst_launch_parse()API with ’bin’ as bintype. That way it is possible to build partial pipelines instead of a full-fledged top-level pipeline.Links[[srcelement].[pad1,...]] ! [[sinkelement].[pad1,...]] [[srcelement].[pad1,...]] ! caps ![[srcelement].[pad1,...]]Links the element with name srcelement to the elementwith name sinkelement, using the caps specified incaps as a filter. Names can be set on elements with the name property. If the name is omitted, the element that was specified directly in front of or after the link is used. This works across bins. If a padname is given, the link is done with these pads. If no pad names are given all possibilities are tried and a matching pad is used. If multiple padnames are given, both sides must havethe same number of pads specified and multiple links are done inthe given order. So the simplest link is a simple exclamation mark,that links the element to the left of it to the element right ofit.Capsmimetype [, property[, property ...]]] [; caps[; caps ...]]Creates a capability with the given mimetype and optionally withgiven properties. The mimetype can be escaped using " or ’. Ifyouwant to chain caps, you can add more caps in the same format afterwards.Propertiesname[:type]=valuein lists and ranges: [type=]valueSets the requested property in capabilities. The name is an alphanumeric value and the type can have the following case-insensitive values:o i or int for integer values or rangeso f or float for float values or rangeso 4 or fourcc for FOURCC valueso b, bool, or boolean for boolean valueso s, str, or string for stringso l or list for listsIf no type was given, the following order is tried: integer, float, boolean, string. Integer values must be parsable bystrtol(), floats by strtod(). FOURCC values may either be integersor strings. Boolean values are (case insensitive) yes, no, true or false and may like strings be escaped with " or ’.Ranges are in this format: [ property, property ]Lists use this format: ( property [, property ...] )PipelineControlA pipeline can be controlled by signals. SIGUSR2 will stop the pipeline (GST_STATE_NULL); SIGUSR1 will put it back to play(GST_STATE_PLAYING). By default, the pipeline will start in theplaying state. There are currently no signals defined to go into the ready or pause (GST_STATE_READY andGST_STATE_PAUSED) stateexpli- citely.EXAMPLESThe examples below assume that you have the correct plugins available. In general, "sunaudiosink" can be substituted with another audio output plugin such as "esdsink", "alsasink", "osxaudiosink", or "artsdsink". Likewise, "xvimagesink" can be substituted with "ximagesink", "sdlvideosink", "osxvideosink", or"aasink". Keep in mind though that different sinks might accept different formats and even the same sink might accept different formats on different machines, so you might need to add converterelements like audioconvert and audioresample (for audio) or ffmpegcolorspace (for video) in front of the sink to make things work.Example 1: Audio PlaybackPlay the WA V music file "music.wav":example% gst-launch filesrc location=music.wav ! wavparse ! sunaudiosinkPlay the mp3 music file "music.mp3":example% gst-launch filesrc location=music.mp3 ! flump3dec !Play the Ogg V orbis file "music.ogg":example% gst-launch filesrc location=music.ogg ! oggdemux ! vorbisdec ! audioconvert ! sunaudiosinkPlay an mp3 file or an http stream using GNOME-VFS: example% gst-launch gnomevfssrc location=music.mp3 ! flump3dec ! sunaudiosinkexample% gst-launch gnomevfssrclocation=/music.mp3 ! flump3dec ! sunaudiosinkUse GNOME-VFS to play an mp3 file located on an SMB server:example% gst-launch gnomevfssrclocation=smb://computer/music.mp3 ! flump3dec !Example 2: Video PlaybackPlay an Ogg video file:example% gst-launch filesrc location=video.ogg ! oggdemux ! theoradec ! ffmpegcolorspace ! xvimagesinkExample 3: Format ConversionConvert an mp3 music file to the Ogg V orbis format: example% gst-launch filesrc location=music.mp3 ! flump3dec ! audioconvert ! vorbisenc ! oggmux ! filesinklocation=music.oggConvert an mp3 music file to the FLAC format:example% gst-launch filesrc location=music.mp3 ! flump3dec ! audioconvert ! flacenc ! filesink location=test.flacConvert a .WA V file to the Ogg V orbis format:example% gst-launch filesrc location=music.wav ! wavparse ! audioconvert ! vorbisenc ! oggmux ! filesinklocation=music.oggExample 4: Recording AudioRecord sound from your audio input and encode it into an Ogg file:example% gst-launch sunaudiosrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=music.oggExample 5: Compact Disk (CDDA)Play track number 3 from compact disc:example% gst-launch cddasrc track=3 ! sunaudiosinkPlay track number 5 from compact disc:example% gst-launch cdda://5 ! sunaudiosinkExample 6: DiagnosticGenerate a null stream and ignore it:example% gst-launch fakesrc ! fakesinkGenerate a pure tone to test the audio output:example% gst-launch audiotestsrc ! sunaudiosinkGenerate a familiar test pattern to test the video output: example% gst-launch videotestsrc ! xvimagesinkGenerate a familiar test pattern to test the video output: example% gst-launch videotestsrc ! ximagesinkExample 7: Automatic LinkingYou can use the decodebin element to automatically select the right elements to get a working pipeline.Play any supported audio format:example% gst-launch filesrc location=musicfile ! decodebin ! sunaudiosinkPlay any supported video format with video and audio output. Threads are used automatically.example% gst-launch filesrc location=videofile ! decodebin name=decoder decoder. ! queue ! audioconvert ! audioresample ! osssink decoder. ! ffmpegcolorspace ! xvimagesinkTo make this even easier, you can use the playbin element: example% gst-launch playbin uri=file:///home/joe/foo.aviExample 8: Filtered ConnectionsThese examples show how to use filtered capabilities.Show a test image and use the YUY2 or YV12 video format for this:example% gst-launch videotestsrc !video/x-raw-yuv,format=urcc)YUY2;video/x-raw-yuv,format=u rcc)YV12 ! xvimagesinkRecord audio and write it to a .wav file. Force usage of signed 16 to 32 bit samples and a sample rate between 32kHz and64KHz:example% gst-launchsunaudiosrc ! ’audio/x-raw-int,rate=[32000,64000],width=[16,3 2],depth={16,24,32},signed=(boolean)true’! wavenc ! filesink location=recording.wav更加详细的信息查看:/documentation/。

相关主题