[Csnd-dev] Mike's Youtube script for Linux
Date | 2016-12-21 18:58 |
From | Dave Seidel |
Subject | [Csnd-dev] Mike's Youtube script for Linux |
I took Mike's very useful Python script that creates MP4 videos with a static spectrogram image, ported it to Linux, and did some compulsive refactoring and generalization. I have some more work I want to do on it (e.g., I changed the spectrogram to remove the axes and legends, because I prefer it that way, but the user should have an option for this), and will eventually put it on GitHub, but here's what I have now. Note that the new script takes the name of a text file where all the metadata (and the sounds filename) is specified as simple key=value pairs like so:
[__track__] where the "__track__" header is mandatory. Comments and suggestions are welcome. Also, I think it would not be too hard to make this script work cross-platform, but I have only Linux here. I am calling it "ytrender.py", but am open to a better name. - Dave import argparse |
Date | 2016-12-21 23:46 |
From | Kelly Hirai |
Subject | Re: [Csnd-dev] Mike's Youtube script for Linux |
oh man, i like this. its getting so hard to publish music without some visual component. can't wait to try it out. k. On 12/21/2016 01:58 PM, Dave Seidel wrote: > I took Mike's very useful Python script that creates MP4 videos with a > static spectrogram image, ported it to Linux, and did some compulsive > refactoring and generalization. I have some more work I want to do on it > (e.g., I changed the spectrogram to remove the axes and legends, because I > prefer it that way, but the user should have an option for this), and will > eventually put it on GitHub, but here's what I have now. Note that the new > script takes the name of a text file where all the metadata (and the sounds > filename) is specified as simple key=value pairs like so: > > [__track__] >> label=hexany_catalog_part1 >> soundfile=hexany_catalog_part1_master.wav >> album=Hexany Permutations >> title=Part 1 >> track=1 >> year=2016 >> artist=Dave Seidel >> composer=Dave Seidel >> genre=Electroacoustic >> publisher=Mysterybear Music, ASCAP >> copyright=Copyright (c) 2016 by Dave Seidel, some rights reserved. >> Licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 >> Unported (CC BY-NC-SA 3.0) >> recorded=2016-12-18 15:10:58-05:00 >> encoded=2016-12-18 15:10:58-05:00 >> tagged=2016-12-18 15:10:58-05:00 > > > where the "__track__" header is mandatory. > > Comments and suggestions are welcome. Also, I think it would not be too > hard to make this script work cross-platform, but I have only Linux here. > > I am calling it "ytrender.py", but am open to a better name. > > - Dave > > import argparse >> import datetime >> import os >> import os.path >> import sys >> import ConfigParser >> # >> # generate spectrogram image (png) >> # >> def gen_spectrogram(meta, raw_graph=False): >> sox_spectrogram_command = 'sox %s' % ' '.join(( >> '-S "%s"' % meta["soundfile"], >> '-n spectrogram', >> '-r' if raw_graph else '', >> '-o "%s.png"' % meta["label"], >> '-t "%s"' % "wav", >> '-c "%s"' % "%s (%s)" % (meta["copyright"], meta["publisher"]) >> )) >> return os.system(sox_spectrogram_command) >> # >> # generate video (mp4) >> # >> def gen_video(meta): >> cwd = os.getcwd() >> mp4_metadata = ' '.join(( >> '-metadata title="%s: %s"' % (meta["album"], meta["title"]), >> '-metadata album="%s"' % meta["album"], >> '-metadata date="%s"' % meta["year"], >> '-metadata track="%s"' % meta["track"], >> '-metadata genre="%s"' % meta["genre"], >> '-metadata publisher="%s"' % meta["publisher"], >> '-metadata copyright="%s"' % meta["copyright"], >> '-metadata composer="%s"' % meta["composer"], >> '-metadata artist="%s"' % meta["artist"] >> )) >> mp4_command = 'ffmpeg %s' % ' '.join(( >> '-loglevel info', >> '-hide_banner', >> '-y', >> '-loop 1', >> '-framerate 2', >> '-i "%s"' % os.path.join(cwd, "%s.png" % meta["label"]), >> '-i "%s"' % os.path.join(cwd, meta["soundfile"]), >> '-c:v libx264', >> '-preset medium', >> '-tune stillimage', >> '-crf 18', >> '-codec:a aac', >> '-strict -2', >> '-b:a 384k', >> '-r:a 48000', >> '-shortest', >> '-pix_fmt yuv420p', >> '-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"', >> '%s' % mp4_metadata, >> '"%s"' % os.path.join(cwd, "%s.mp4" % meta["label"]) >> )) >> return os.system(mp4_command) >> >> >> def main(argv): >> metafile = argv[0] >> config = ConfigParser.RawConfigParser() >> config.read(metafile) >> # convert list of tuples to dict >> meta = dict(config.items("__track__")) >> >> print "[[[ Generating spectrogram... ]]]" >> gen_spectrogram(meta) >> print "[[[ Generating video... ]]]" >> gen_video(meta) >> >> print "[[[ Done! ]]]" >> return 0 >> >> if __name__ == "__main__": >> if len(sys.argv) < 2: >> print "Usage: ytrender METADATA_FILE" >> sys.exit(1) >> >> sys.exit(main(sys.argv[1:])) |