2020-11-02 16:17:57 +01:00
import argparse
2020-11-02 13:08:18 +01:00
import logging
import sys
from micstream import AudioSource , Server
def init_logging ( ) :
logging . basicConfig ( level = logging . INFO ,
stream = sys . stdout ,
format = ' [ %(asctime)s ] %(name)s | %(levelname)-8s | %(message)s ' ,
datefmt = ' % Y- % m- %d % H: % M: % S ' )
2020-11-02 16:17:57 +01:00
def get_args ( ) :
parser = argparse . ArgumentParser ( description = ' Stream an audio source over HTTP as mp3 ' )
2020-11-02 16:21:58 +01:00
parser . add_argument ( ' -i ' , ' --device ' , help = ' ALSA/Pulse device ID/name ' , required = True , dest = ' device ' )
2020-11-02 16:17:57 +01:00
parser . add_argument ( ' -s ' , ' --sound-system ' , help = ' Sound system. Supported: alsa, pulse. Default: alsa ' , required = False , default = ' alsa ' , dest = ' audio_system ' )
parser . add_argument ( ' -v ' , ' --verbose ' , help = ' Verbose/debug mode ' , required = False , action = ' store_true ' , dest = ' debug ' )
parser . add_argument ( ' -a ' , ' --address ' , help = ' Bind address (default: 0.0.0.0) ' , required = False , default = ' 0.0.0.0 ' , dest = ' address ' )
parser . add_argument ( ' -p ' , ' --port ' , help = ' HTTP listen port (default: 8080) ' , required = False , default = 8080 , type = int , dest = ' port ' )
parser . add_argument ( ' -e ' , ' --endpoint ' , help = ' HTTP endpoint for streaming (default: /stream.mp3) ' , required = False , default = ' /stream.mp3 ' , dest = ' endpoint ' )
parser . add_argument ( ' -r ' , ' --sample-rate ' , help = ' Recording sample rate (default: 44100) ' , required = False , default = 44100 , type = int , dest = ' sample_rate ' )
parser . add_argument ( ' -b ' , ' --bitrate ' , help = ' mp3 compression bitrate, in kbps (default: 128) ' , required = False , default = 128 , type = int , dest = ' bitrate ' )
parser . add_argument ( ' -c ' , ' --channels ' , help = ' Number of recording channels (default: 1) ' , required = False , default = 1 , type = int , dest = ' channels ' )
parser . add_argument ( ' -f ' , ' --ffmpeg ' , help = ' Path to the FFmpeg binary (default: ffmpeg) ' , required = False , default = ' ffmpeg ' , dest = ' ffmpeg_bin ' )
parser . add_argument ( ' -B ' , ' --bufsize ' , help = ' Size of the audio chunks to be delivered to the server (default: 8192 bytes) ' , required = False , default = 8192 , type = int , dest = ' bufsize ' )
opts , _ = parser . parse_known_args ( sys . argv [ 1 : ] )
return opts
2020-11-02 13:08:18 +01:00
def main ( ) :
init_logging ( )
2020-11-02 16:17:57 +01:00
args = get_args ( )
with AudioSource ( device = args . device ,
audio_system = args . audio_system ,
sample_rate = args . sample_rate ,
bitrate = args . bitrate ,
channels = args . channels ,
ffmpeg_bin = args . ffmpeg_bin ,
bufsize = args . bufsize ,
debug = args . debug ) as source , \
Server ( host = args . address ,
port = args . port ,
endpoint = args . endpoint ,
debug = args . debug ) as server :
2020-11-02 13:08:18 +01:00
for sample in source :
server . process_audio ( sample )
if __name__ == ' __main__ ' :
main ( )
# vim:sw=4:ts=4:et: