Hi
I've been trying to use pymedia to generate MP3 files (for screencasting
with pyvnc2swf).
Unfortunately I can't get the example code to produce valid MP3 files.
pymedia itself can read them back, but they don't seem to have valid
headers.
MP2 files generated are fine.
This is from looking at the files with mpginfo:
[EMAIL PROTECTED] data]$ mpginfo test-pymedia-input.mp3
Skipped 415 zeroes at start of file
mmm, this file does not start with a pack, offset: 415
use the desperate_mode switch as the first option -X to search for a
header in the whole file!
if you want to force the operation. May yield to an endless loop if no
valid header is found!
Does not even begin with a 00 00 01 xx sequence!
No success at all.
test-pymedia-input.mp3 is not a valid mpeg file
Whereas .mp2 files work fine:
[EMAIL PROTECTED] data]$ mpginfo test-mp2-input.mp2
test-mp2-input.mp2
Audio : Mpeg 1 layer 2
Estimated Duration: 16.67s
128 kbps 44100 Hz
Frame size: 417 bytes
Mono, No emphasis, original
Lame can then successfully recode the file (lame test-mp2-input.mp2
test-mp2-input.mp3) and that gives a valid mp3 file:
[EMAIL PROTECTED] data]$ mpginfo test-mp2-input.mp3
test-mp2-input.mp3
Audio : Mpeg 1 layer 3
Estimated Duration: 16.74s
64 kbps 44100 Hz
Frame size: 208 bytes
Mono, No emphasis, original
Lame can actually recover the mp3 file that pymedia produces in a
similar way (lame test-pymedia-input.mp3 recoded.mp3), and seems to add
header information
I tried adding muxer encoding to the sample but it doesn't produce
anything on start() or end()
Attached is the record_sound program I am using (modified to use
threads, pick up keyboard interrupts, and do muxing).
This may be helpful as a sample anyway, but can anyone see what I am
doing wrong? Or is this a library error?
I'm running on Fedora Core 4 with the following versions:
python-2.4.1-2
pymedia-1.3.5.0-1 (built from source)
lame-3.96.1-2.2.fc4
Any help appreciated
Regards
David
import time, sys
import pymedia.audio.sound as sound
import pymedia.audio.acodec as acodec
import pymedia.muxer as muxer
import threading
class voiceRecorder:
def __init__(self, name ):
self.name = name
self.finished = False
def record(self):
self.snd.start()
while not self.finished:
s= self.snd.getData()
if s and len( s ):
for fr in self.ac.encode( s ):
# We definitely should use mux first, but for
# simplicity reasons this way it'll work also
block = self.mux.write( self.stream_index, fr )
if block is not None:
self.f.write( block )
else:
time.sleep( .003 )
# time.sleep( 0 )
self.snd.stop()
def run(self):
print "recording to", self.name
self.f= open( self.name, 'wb' )
# Minimum set of parameters we need to create Encoder
cparams= { 'id': acodec.getCodecID( 'mp2' ),
'bitrate': 128000,
'sample_rate': 44100,
'channels': 1 }
self.ac= acodec.Encoder( cparams )
self.snd= sound.Input( 44100, 1, sound.AFMT_S16_LE )
self.mux = muxer.Muxer("mp2")
self.stream_index = self.mux.addStream( muxer.CODEC_TYPE_AUDIO,
self.ac.getParams() )
block = self.mux.start()
if block:
self.f.write(block)
# Loop until Ctrl-C pressed or finished set from outside
self.finished = False
thread = threading.Thread(target=self.record)
thread.start()
try:
while not self.finished:
time.sleep( .003 )
except KeyboardInterrupt:
self.finished = True
print "finishing recording to", self.name
# Stop listening the incoming sound from the microphone or line in
thread.join()
footer = self.mux.end()
if footer is not None:
self.f.write(footer)
self.f.close()
print "finished recording to", self.name
#
----------------------------------------------------------------------------------
# Record stereo sound from the line in or microphone and save it as mp3 file
# Specify length and output file name
# http://pymedia.org/
if __name__ == "__main__":
if len( sys.argv )!= 2:
print 'Usage: %s <file_name>' % sys.argv[ 0 ]
else:
voiceRecorder( sys.argv[ 1 ] ).run()
_______________________________________________
Pymedia-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pymedia-users