[arm-allstar] Recording Node Audio
Patrick Perdue
borrisinabox at gmail.com
Tue Jul 12 17:12:50 EDT 2022
Yeah, OK. I'm an idiot. I had ;archivetype=pcm commented out, so it was
defaulting to gsm wav. I don't want GSM, not now, not ever. KILL IT!\
With archivetype=pcm, it doesn't create wave files. Instead, it creates
.pcm files, ,which are actually raw ULAW. Takes more disk space, sounds
better.
Here is my proposed modification to Kevin's script to convert all of
these raw ULAW files to a single 8 kHz 16-bit linear PCM file, avoiding
all the GSM nastiness, when archivetype=pcm. I would actually just use a
custom include in rpt.conf such that only one rpt.conf needs to exist,
then delete and create the custom file with only the archive lines. This
way, if you ever need to make changes to rpt.conf, you don't have to
manage multiple versions.
in /etc/asterisk/rpt.conf under your node's stanza somewhere:
#includeifexists /etc/asterisk/custom/rpt_archive
Create a file called /etc/asterisk/custom/archive_parameters
The contents of /etc/asterisk/custom/archive_parameters looks like this.
archivedir = /tmp/allstar_archive/507412/
;archiveaudio=1
archivetype=pcm
Now for the script modifications. SoX doesn't have a handler for the
.pcm extension, so I use cat to feed all the files to it sequentially as
stdin.
#!/bin/bash
# This script is used to Toggle On/Off archiving for Node 507412
# Move appropriate .conf file in and issue Asterisk Reload
if [ $1 -eq '0' ]; then
rm /etc/asterisk/custom/rpt_archive
elif [ $1 -eq '1' ]; then
cp /etc/asterisk/custom/archive_parameters
/etc/asterisk/custom/rpt_archive
mkdir -p /tmp/allstar_archive/507412
fi
asterisk -rx "rpt reload"
# If stopping archive, combine all .PCM files into one archive .wav file
if [ $1 -eq '0' ]; then
mount -a
mkdir -p /mnt/NAS/allstar_archive/$2
cat /tmp/allstar_archive/507412/*.pcm | sox -t raw --channels 1
--rate 8000 -e u-law - /tmp/allstar_archive/507412/$2_complete_$(date
'+%Y-%m-%d-%H.%M.%S').wav
mv /tmp/allstar_archive/507412/* /mnt/NAS/allstar_archive/$2
On 7/12/2022 4:18 PM, Patrick Perdue wrote:
> There are a bunch of possibilities here, but what I normally do is use
> outstreamcmd instead, then use dd to copy the output of a pipe to a
> file, usually in /tmp or an external drive so I am not writing to the
> SD card. This will give you one contiguous file, no timestamps or
> metadata, unlike the archivedir directive, just as your node
> transmitted it, including any telemetry, in raw PCM, which you will
> then need to convert to wav. Have a cron job that fires up dd at a
> specific point, and another one that kills it.
>
> Note that /tmp lives in RAM, so the more free memory your Pi has, the
> longer you can record directly to /tmp if you choose to do things this
> way. I have most of my nodes on Raspberry Pi 3's, which have 1GB of
> memory, but I have a couple on 2 and 4GB boards with no external media
> attached. I almost never write an archive like this to the SD card,
> just keeping it in RAM long enough to grab it later via SFTP. The only
> time this could be an issue is if your node suddenly shuts down while
> archiving. RAM is volatile, after all. For context, 1 minute of linear
> recording in this format uses 960Kb of disk space, so a two-hour net
> recording should be about 112.5 Mb, give or take if you put some space
> on either side of net time. If you use the archivedir feature, (I'll
> get to that later), which doesn't record dead air, this can be smaller.
>
> To record using outstreamcmd/nptee, in rpt.conf under your node's
> stanza, add the following:
>
> outstreamcmd=/usr/local/bin/nptee,pipe1
>
> and then restart Asterisk, or rpt reload.
>
> Now, you can pipe the output to a file with a command like this:
>
> dd if/tmp/outsound/pipe1 of=/Some_Directory/Some_filename.raw
> status=progress
>
> Since there is no wave header, the file extension is arbitrary, and in
> fact, isn't necessary at all, really. I'm just using .raw as an
> example. It could be anything, or indeed nothing.
>
> If you do this from your shell, you will get a foreground process that
> can be stopped with control+c. Obviously, not what you need or care
> about for background operation, and you can tape the status=progress
> bit out for anything you fork to the background, or redirect the
> output to /dev/null. It's just good to see that in the console to make
> sure it's working.
>
> You can give the output file a pretty name by using the date command,
> like so.
>
> dd if=tmp/outsound/pipe1 of=/Some_Directory/net-`date
> +%Y-%m-%d-%H%-M-%-S`.raw
>
> This yields the format YYYY-mm-dd-HH-MM-SS, where HH represents the
> hour in 24-hour format, MM is minutes, and SS is seconds. This can be
> tweaked, see the man page for gnu date formatting strings. I prefer
> using this format as this is how practically every operating system
> sorts things in a list of files.
> There are far better ways to do what I'm about to describe, but I'm
> going for quick and dirty here due to lack of time (I need to get
> going for an event in a few minutes). Others, feel free to refine, for
> example by incorporating this into a proper bash script with a start
> and stop command argument.
> In cron, if you want your recording to always start at, say, 6:55 PM
> every and end at 9:05 PM, Tuesday, put in two jobs like this.
> 55 18 * * 2
>
> dd if=tmp/outsound/pipe1 of=/Some_Directory/net-`date
> +%Y-%m-%d-%H%-M-%-S`.raw
>
> 05 21 * * 2 killall -9 dd
> But wait, this is still just a raw PCM file, which needs to be
> converted to something an audio editor likes. Well, most can open raw
> audio, which is what I do just to avoid a conversion process.
> Parameters are PCM, 8000 hz, 16-bit mono, signed, LE. You can use SoX
> to do that conversion.
>
> I was going to make a writeup on how to start/stop the archiveaudio
> function on a schedule, but...
> It's been a while since I've used archiveaudio in HamVoIP. I have it
> set to PCM, but it is actually generating GSM 6.10 wave files. Hardly
> ideal for a true archive. What's up with that? So, I'll hold off on
> that until I figure out why this is happening.
>
> On 7/12/2022 2:20 PM, "Chris via ARM-allstar" wrote:
>> I understand that by adding or commenting out a line which says
>>
>> archivedir=/tmp
>>
>> to the rpt.conf file in the node section will enable or disable
>> recording.
>> But, to put the results out as a podcast, I need to combine all those
>> wav
>> files into a single file and move it to my PC. How do I combine wav
>> files on
>> the Pi?
>>
>>
>> Additionally, is it possible to automate this, turn recording on/off at
>> specific times, and collect and concatenate the resulting files,
>> maybe even
>> send them to my Dropbox or similar storage?
>>
>>
>> Thanks for any assistance.
>>
>>
>> 73
>>
>>
>> Chris
>>
>> VE3RWJ (Absolute Tech Net podcast)
>>
>> _______________________________________________
>>
>> ARM-allstar mailing list
>> ARM-allstar at hamvoip.org
>> http://lists.hamvoip.org/cgi-bin/mailman/listinfo/arm-allstar
>>
>> Visit the BBB and RPi2/3/4 web page - http://hamvoip.org
More information about the ARM-allstar
mailing list