<span style="font-family: courier new,monospace;">Hi all,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Sorry if this is the wrong place to ask questions about code written with the Python bindings... there doesn&#39;t seem to be a python-gst mailing list, so I figured I&#39;d give this a shot.
</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">I&#39;m new to gstreamer and trying to write some code that will slurp a stream off the web into a file, and transcode it to MP3 if not already in that format.&nbsp; The application is to automatically convert it to a form that most portable audio players can understand.
<br><br>I have some working code, but not exactly sure &quot;why&quot; it works ;-)&nbsp; Basically, what I do is I set up a gnomevfssrc ! typefind pipeline, and connect the have-type signal of the typefind element.&nbsp; Then I start the pipeline playing.&nbsp; When the have-type signal is received, I pause the pipeline, and then:
<br>&nbsp; (a) if the detected stream is MP3, I make an identity element as the transcoder: transcoder = identity<br>&nbsp; (b) if it&#39;s not MP3, I make a real transcoder: transcoder = decodebin ! audioconvert ! lame<br>Next, I link this transcoder to the end of the pipeline and link that to a filesink, so I end up with:
<br>&nbsp; gnomevfssrc ! typefind ! transcoder ! filesink<br>Finally, I unpause the pipeline, and the MP3 output stream magically goes into the output file.&nbsp; Hooray!<br><br>Here are a few things I&#39;m trying to understand:<br>
<br>* Are there any subtleties to modifying a running pipeline?&nbsp; When I pause the pipeline, append to it, and then unpause it, should I be worried about data getting lost, or buffer overflows, or anything like that?&nbsp; This doesn&#39;t seem to be a problem, but maybe I&#39;ve just got lucky.
<br><span style="font-style: italic;"></span><br>* If I add() the transcoder and sink elements to the pipeline BEFORE I&#39;m ready to actually link their pads, then the pipeline runs, and typefind works... but I get no output.&nbsp; Why?
<br><br>* Typefind identifies MP3 files as application/id3 sometimes, rather than audio/mpeg.&nbsp; Is there a more correct and reliable way to identify an MP3 stream?<br><br>* How can I identify the duration of the stream processed by the pipeline?&nbsp; 
pipeline.get_clock() seems to keep track of the REAL time, rather than the amount of audio processed.<br><br>Any help will be appreciated!&nbsp; Thanks a lot!<br><br>Dan Lenski<br><br><br>PS- The relevant parts of my code so far:
</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">class transcode_to_mp3(gst.Bin):<br>&nbsp;&nbsp;&nbsp; # a bin containing decodebin, audioconvert, and lame
<br>&nbsp;&nbsp;&nbsp; # to auto-convert any audio stream to MP3<br>&nbsp;&nbsp;&nbsp; ...<br><br>class StreamRecorder:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; def __init__(self, uri, filename):
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # stream reader</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.stream = gst.element_factory_make(&#39;gnomevfssrc&#39;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.stream.set_property(&#39;location&#39;, uri)
</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # automatically identify stream type</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.typefind = gst.element_factory_make(&#39;typefind&#39;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.typefind.set_property(&#39;minimum&#39;, 100)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.typefind.connect(&#39;have-type&#39;, self.autoconfigure
)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # convert arbitrary audio stream to MP3, or do nothing to an MP3
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.transcode = transcode_to_mp3()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.identity = gst.element_factory_make(&#39;identity&#39;)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # write to file output</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sink = gst.element_factory_make(&#39;filesink&#39;)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sink.set_property(&#39;location&#39;, filename)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # partially assemble pipeline</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline = gst.Pipeline()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.add(self.stream, self.typefind)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.stream.link
(self.typefind)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; def autoconfigure(self, tf, prob, caps):</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.set_state(gst.STATE_PAUSED)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ismp3 = (caps[0].get_name() == &#39;audio/mpeg&#39; and caps[0][&#39;layer&#39;]==3)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ismp3: stage = 
self.identity</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else: stage = self.mp3ify</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.add(stage, self.sink)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gst.element_link_many
(self.typefind, stage, self.sink)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.set_state(gst.STATE_PLAYING
)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; def start(self):</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.set_state(gst.STATE_PLAYING)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
&nbsp;&nbsp;&nbsp; def stop(self):</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pipeline.set_state(gst.STATE_NULL)</span><span style="font-family: courier new,monospace;">
<br></span>