Showing posts with label Terminal. Show all posts
Showing posts with label Terminal. Show all posts

Sunday, July 9, 2017

Blending videos with bash (imagemagick, ffmpeg)

Years ago I was trying to figure out "batch processing." This refers to the concept of applying a single transformation to an entire set of files with one command. Specifically, I wanted to combine two videos, matching frame-by-frame, and blend the two videos together.

The software you'll need to complete this is ffmpeg and imagemagick. Both are CLI softwares you can install via Cygwin, or MacPorts. This is much easier to do via MacPorts, but if you're on Windows, it's not impossible. I was able to install both on an offline Windows 10 box.

To demonstrate what will happen, I'm going to show a single frame as an example:


 This is a blended image, the result of two images composed with an imagemagick CLI command into a final result. To achieve this you run:

$ magick composite -gravity center -blend 30x70% strawberry.png banana.png combo.png

Now, the concept for video, is to blend two videos together, matching frame-by-frame, so that if two 60 fps videos are both 2 seconds in length, you'll blend 120 frames from each into 120 final, blended frames. The concept of completing this task with a single command is what's referred to as "batch processing."

For the code snippets, let's consider "Clouds" and "Flowers" instead of Strawberry and banana, for now...

1. First gather some info about our video, we run:


ffmpeg -i Clouds.MOV

 Metadata:
    major_brand     : qt
    minor_version   : 0
    compatible_brands: qt
    creation_time   : 2019-07-02T21:32:31.000000Z
    com.apple.quicktime.make: Apple
    com.apple.quicktime.model: iPod touch
    com.apple.quicktime.software: 12.0
    com.apple.quicktime.creationdate: 2019-07-02T17:32:31-0400
  Duration: 00:00:05.67, start: 0.000000, bitrate: 15449 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 15369 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
   
So we have 29.98 fps, let's round up to 30 fps
   
To get the frames we run:
    ffmpeg -i Flowers.MOV -vf fps=30 Flowers_frames/Flowers%03d.jpg -hide_banner

    ...and the same for the Clouds
   
Then to compose them into the final frames we just run this:
   
    $ for i in $(seq -f "%03g" 1 170); do magick composite -blend 50x50% "Clouds_frames/Clouds"${i}".jpg" "Flowers_frames/Flowers"${i}".jpg" "Combo_frames/Combos"${i}".jpg"; done
   
Now that we have the final composed frames, we reanimate these frames into a video with this command:
   
    $ ffmpeg -r 30 -f image2 -s 1920x1080 -i Combo_frames/Combos"%03d".jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p Combo.mov

Note that %05d refers to the length of the largest digit as 5, i.e. 11568 and so all numbers will be padded with the appropriate amount of zeroes to match this length (i.e. 20 becomes 00020), and all filenames will be of the same length. This is so ffmpeg doesn't confuse frame ordering during rendering.

Lastly, you can take the original video's audio and the composed and rendered video and combine those... offsetting the video by .10 seconds (for a better sync)...
ffmpeg -itsoffset 0.1 -i video.mp4 -i original.mp4 -c copy -map 0:v:0 -map 1:a:0 final.mp4

Where video.mp4 is the rendered psychedelic version and original is the original (with audio). The offset component " -isoffset" is applied to the "-i .mp4" that comes directly after it.

That concludes this tutorial. If you have any questions, I'd be glad to answer them. Good luck!

And that's it. I'll post a demonstration once I film the videos properly.

Monday, September 7, 2015

Tutorial: G-chatting in the Terminal

This is a Mac OSX tutorial to install Gchat in your Bourne again Shell with bitlbee+irssi via MacPorts

  
Step 1. Install MacPorts, which is a package manager which allows you to easily install utilities.
In this instance, we'll use MacPorts to install bitlbee and irssi, see Steps 2 and 3.
Go to The MacPorts website and click on "Installing MacPorts"
This tutorial is for Mac OSX, specifically, I am running Mavericks, which is OS 10.9.
During the MacPorts installation they may ask you to also install Xcode, but I've skipped this in the past with no real consequences.

Step 2. Install irssi, which is a chat client that supports IRC protocol.
To install it... open up a shell and run $ sudo port install irssi
Along the way, it asked me to get jiggy with something called javac, I obliged.

Step 3. Install bitlbee, which is an IRC client that interfaces with irssi and conveniently lets you use multiple IM services at once.
So you can login in once and have your MSN, AIM and gchat all ready to go.
To install it... open up a shell and run $ sudo port install bitlbee

Step 4. run $ bitlbee
Here was my result:
$ bitlbee
Warning: Unable to read configuration file `/opt/local/etc/bitlbee/bitlbee.conf'.
:localhost.localdomain NOTICE AUTH :BitlBee-IRCd initialized, please go on
:localhost.localdomain NOTICE AUTH :If you read this, you most likely accidentally started BitlBee in inetd mode on the command line. You probably want to run it in (Fork)Daemon mode. See doc/README for more information.
ERROR :Closing link: Ping Timeout: 180 seconds

so then I ran...
$ cd /opt/local/etc/bitlbee
$ sudo mv bitlbee.conf.sample bitlbee.conf
$ sudo emacs bitlbee.conf
...Then I went in and changed the line
#RunMode = Inetd ...to
RunMode = ForkDaemon
now I rerun
$ bitlbee
$
success!

Step 5.$ irssi
Now once inside the irssi interface, type in "/connect localhost" this will connect you to the local bitlbee server.
Now type in Ctrl+p to shift over to the bitlbee-connected window.
Now you can just type in "help" without the leading forward slash, to read out the basics of bitlbee.
You will need to synchronize your IM information into bitlbee so it will work, that is done like so...

Step 6.
Add your gchat account with "account add jabber you@gmail.com" Then type in /OPER and hit enter.
It will prompt you to add a password to you account, type it in and hit enter.
You can type in "ac l" at any point to list the accounts and their statuses in your session.
To turn on your gchat, type in "ac 0 on". Each account corresponds to a number, in this case, starting at 0 your gchat account will be the first account added so it should be "ac 0 on."
Type in "blist all" to see your buddy list.
For good measure, let's also add an AOL Instant Messenger account...
"account add oscar Your_sn" should work, then simlarly, use /OPER to add the password and then "ac 1 on" to log in.

Step 7. Register your settings so you won't have to do all this everytime you log in.
Type in "register" then add your password with /OPER
At this point I got an error message of
03:06 <@root> Error while opening configuration file.
03:06 <@root> otr save: /opt/local/var/lib/bitlbee/username.otr_fprints: Permission denied
03:06 <@root> Error registering
...So I had to run...
sudo touch /opt/local/var/lib/bitlbee/username.otr_fprints
cd /opt/local/var/lib
sudo chown -R username bitlbee/
sudo chgrp -R staff bitlbee/
sudo chmod -R 775 bitlbee/
That just search did it... then once I ran register and then entered my password via /OPER prompt I got back...
03:15 <@root> Account successfully created

Step 8. Testing it out
To exit bitlbee, type in "/exit" then back at your new shell type in "killall bitlbee" This completely ends your session.
Now let's test out what we've done...
Go to a normal shell and follow this flow...
$ bitlbee
$ irssi
/connect localhost
identify your_register_password (i.e. this is what you typed in at the /OPER prompt after you typed in "register" in Step 7.
blist all

That should search wrap it up. As far as passwords and plaintext, you can google oauth and check that out and there are some other settings in certain config files that are worth checking out and understanding, you can find info online. There are other commands you'll see in there, but that's generally how it's done. Oh yeah and to chat with a buddy you type something like, hmm... /msg smarterchild hello and then Ctrl+p your way over to the chat.

Good luck!

How I wrote/recorded my album "Disposable" (2025)

Click to listen on YouTube, out now!! This blog post will attempt to fully encapsulate as much of the writing/recording/mixing process of th...