Using gphoto2 to Automate Taking Pictures

Using gphoto2 to Automate Taking Pictures


Shawn Powers
Sat, 01/27/2018 – 09:04

Introducing an app that allows DSLR cameras to function as an image or video capture device in Linux.

With my obsession—er, I mean hobby—regarding BirdCam, I’ve explored a
great number of camera options. Whether that means trying to get Raspberry
Pi cameras to focus for a macro shot of a feeder or adjusting depth of
field to blur out the neighbor’s shed, I’ve fiddled with just about every
webcam setting there is. Unfortunately, when it comes to lens options,
nothing beats a DSLR for quality. Thankfully, there’s an app for that.

The gphoto2 suite of drivers and apps allows a huge list of DSLR cameras
to function as image or video capture devices inside Linux. There’s a
compatibility list at the gphoto site,
and even if your camera isn’t listed, it’s likely you’ll be able to use
it in some manner. For example, my Nikon Coolpix P610 isn’t officially
supported, but I’m able to get some images from it regardless. In fact,
it even supports previewing a photo in ASCII art. That might not be a
useful feature, but I found it incredibly fun to play with.

In all reality, if you want to automate taking pictures while using a
real DSLR camera, gphoto2 is probably the tool you want. Whether it’s a
short-term setup on a tripod or a future super-high-def BirdCam (send
me a link!), be sure to check it out. And if I
can get my wife to loan me her Canon DSLR with the 50mm prime lens,
BirdCam might rise to a whole new level!

Building Your Own Audible

Building Your Own Audible


Shawn Powers
Sat, 01/20/2018 – 08:35

A quick look at some options for streaming audio books.

I have audiobooks from a variety of sources, which I’ve purchased in a
variety of ways. I have some graphic audio books in MP3 format, a bunch
of Audible books in their DRM’d format and ripped CDs varying from m4b
(Apple format for books) to MP3 and even some OGG. That diversity makes
choosing a listening platform difficult. In order to meet my idea of
perfection, I need:

  • A system that plays any audio format.

  • A way to play books on multiple platforms, iOS Android and web browsers.

  • Current location stored and honored across platforms.

  • The ability to play audiobooks at different speeds.

  • An easy way to access my entire library remotely.

Several options come close. My favorite Android audiobook app, for
instance, is «Listen», available in the Play Store. But, it falls short on the
multi-platform front and also on accessing books remotely. Audible itself
will do most of what I need, but it doesn’t allow importing remote
books. And, traditional music players are out.

Honestly, Plex seems like the perfect platform for audiobooks. And although
some people do use it, they’re just kludging things. Plex doesn’t natively
support the concepts behind audiobooks, so the process isn’t smooth at
all. I’m honestly hoping that changes in the future, because it would
be a perfect addition to an already amazing system. Thankfully, in the
meantime, there’s BookSonic.

You’ve probably heard of SubSonic, which is a music streaming server that
allows you to do pretty much what I’m looking for with audiobooks, but it’s strictly for
music. Patrik Johansson
has forked SubSonic
and created BookSonic, specifically modified to handle audiobooks. It
even handles tagging and book art. Currently, the system isn’t perfect,
but it’s closer than any other projects come to book nirvana, and if
you use Docker, it’s dead simple to get installed. A simple:

docker -d create \
  --name booksonic \
  -p 8080:8080 \
  -v :/audiobooks \
  -v :/var/booksonic \

will get BookSonic running on your Docker host. Once it’s installed,
just head over to http://docker_host:8080 and log in as admin/admin. You
can start the book scan, and fairly soon, your books will show up for
you to start playing!

Many things about BookSonic do need work (syncing locations
to the web client and so on), but it’s a great start, and it’s a wonderful way
to access all your books in one place. Well, as long as you figure
out how to strip the DRM from your Audible books anyway!
For more details, head over to

Creating an Internet Radio Station with Icecast and Liquidsoap

Creating an Internet Radio Station with Icecast and Liquidsoap


Bill Dengler
Mon, 01/15/2018 – 08:34

Ever wanted to stream prerecorded music or a live event, such as a lecture or
concert for an internet audience? With Icecast and Liquidsoap, you can set up a
full-featured, flexible internet radio station using free software and open

Icecast is «a streaming media (audio/video) server that currently
supports Ogg (Vorbis and Theora), Opus, WebM and MP3 streams. It can
be used to create an internet radio station or a privately running
jukebox and many things in between. It is very versatile in that new
formats can be added relatively easily and supports open standards for
communication and interaction.»

Liquidsoap is «a powerful and flexible
language for describing your streams. It offers a rich collection of
operators that you can combine at will, giving you more power than you
need for creating or transforming streams. But Liquidsoap is still very
light and easy to use, in the UNIX tradition of simple strong components
working together.»

When combined, Icecast and Liquidsoap can
create a flexible, feature-rich internet radio station. In this article,
I describe how to configure Icecast to host an internet radio station. Then, I
explain how to
install and configure Liquidsoap to connect to Icecast, adding random
(or sequential) music playback with smart cross-fading, prerecorded
randomly inserted announcements and jingles, a song request system
and support for live streams, with automated recording and seamless
switching between live and automated programming. I also show how to configure the
server to serve your stream in MP3, Ogg and Opus formats for maximum
player compatibility.

Icecast, Vorbis and related projects are maintained by Xiph.Org,
a nonprofit organization that develops open multimedia standards and
software. To ensure that you are running the latest version of Icecast,
with all (or most) features, you should install from an official Xiph.Org
repository. Visit the list of official repositories here, and follow the instructions on that page to add the Icecast
repository for your distribution. Then, install using your system’s
package manager. On Debian-based systems (such as Ubuntu), you may be
asked to «configure Icecast» during package installation; select
as you will configure the server manually if you are following along with this

Open the Icecast configuration file using your preferred
text editor. On Debian-based systems, the file is located at
/etc/icecast2/icecast.xml. The location on other systems may differ; check
your package’s documentation for the correct path. The configuration
file is in XML format and is divided into several sections. First,
enter your server’s location and email into the location and admin fields,
respectively—for example:

The Heart of Gold

Since each format you’ll set up in Liquidsoap is a separate Icecast
«source», you’ll quickly exhaust the default source limit of two.
So, change
that to ten:


Unless you anticipate listeners connecting from slow or low-bandwidth
environments, disabling Icecast’s burst-on-connect feature will
significantly decrease latency:


The default passwords, «hackme», invite security compromise. Change them
to something else. Also, it’s probably a good idea to change the default
admin user name. The following passwords are just examples; change them
for your configuration both here and when they are mentioned later in
the article:


Enter your system’s fully qualified domain name in the hostname field:

Save and close the file. If you edited the file as root, you’ll need
to reset its permissions. On Debian-based systems, Icecast runs under
user icecast2 and group icecast. To fix permissions on a Debian-based
system, run:

chown icecast2:icecast /etc/icecast2/icecast.xml

On Debian-based systems, Icecast’s system service is disabled by
default. Open the file /etc/default/icecast2, and set enabled to
true. Then save and close the file.

Most modern Linux systems use systemd for service management. To enable
Icecast on boot and start it for this session, run the following commands
as root (using sudo or similar):

systemctl enable icecast2
systemctl start icecast2

Service names on various systems differ; if those commands don’t work,
check your system’s documentation for the correct service name.

Many distributions provide broken and out-of-date versions of Liquidsoap
in their repositories. For this reason (along with improved ability
to customize your installation), the Liquidsoap developers recommend
installing it using the OCaml Package Manager (opam). Use your distro’s
package manager to install opam. If you’ve been doing everything up to
this point logged in as root, you’ll now need to create a non-root user
under which to install Liquidsoap. You also need to install sudo and give
this new user permission to use it. On Debian-based systems, the
and gpasswd utilities allow you to create users and add them to groups,
respectively. On Debian-based systems, run the following commands as root
to add a new user and grant it sudo access (for other systems, refer to
the documentation). Let username represent the user name of the new user:

adduser username
gpasswd -a username sudo

Performing as your non-root user, initialize the OCaml Package Manager
by running:

opam init

Answer «yes» when asked to modify your profile; this will place Liquidsoap
on your path and allow it to be executed when you type its name. To
apply opam changes, run:

eval `opam config env`

Next, install Liquidsoap’s system dependencies:

opam install depext
opam depext taglib mad lame vorbis cry ssl samplerate
 ↪magic opus liquidsoap

Now, install liquidsoap by replacing depext with

opam install taglib mad lame vorbis cry ssl samplerate
 ↪magic opus liquidsoap

To set up a starting point for the station configuration and enable
Liquidsoap as a service, the developers have created liquidsoap-daemon, a
set of scripts for using Liquidsoap as a system service. Liquidsoap-daemon
uses systemd for service management by default; therefore, it is compatible
with most modern Linux distributions. To set it up, install Git using your
system’s package manager, then run the following as your non-root user:

git clone
cd liquidsoap-daemon

You may be prompted to enter your user’s password to authenticate
sudo. Once the dæmon is installed, you’ll now create a directory
structure for storing music, jingles and archives of live streams in
your non-root user’s home directory. Run the following command:

mkdir -p ~/music/music1 ~/music/jingles ~/archives

Now, open the file main.liq in the liquidsoap-daemon directory. At this point,
that file just contains:


This line sends no audio nowhere, which is not very interesting, so delete that
line and add the following base configuration (lines starting with # are
comments, so they are ignored by Liquidsoap). This base configuration sets up
one music playlist with songs played in random order, jingles inserted
approximately every seven songs, smart cross-fading, song requests and
automatically recorded live streams. music.mp3, music.ogg and music.opus
stream stored music and jingles in MP3, Ogg Vorbis and Ogg Opus formats
respectively; stream.mp3, stream.ogg and stream.opus play a live stream
when available, falling back to music when the live stream is down:

set("server.telnet", true)
set("server.telnet.port", 1234)
# Music playlists
music1 = playlist("~/music/music1")
# Some jingles
jingles = playlist("~/music/jingles")
# If something goes wrong, we'll play this
security = single("~/music/default.ogg")
# Start building the feed with music
radio = random([music1])
# Add the security, requests and smart crossfade
radio = fallback(track_sensitive = false,
# Now add some jingles
radio = random(weights = [1, 7],[jingles, radio]) # This plays
# a jingle once every approximately seven songs, change 7 to
# another number to change this
# Add a skip command for the music stream
description="Skip the current song.",
fun(_) -> begin source.skip(radio) "Done!" end
#Add support for live streams.
live =
↪"dontpanic1764",buffer=1.0)) #dontpanic1764 is the
# password used to connect a live stream; it can (and should) be
# different from the source-password in icecast.xml.
full = fallback(track_sensitive=false,
# Dump archives
file_name = '~/archives/%Y-%m-%d-%H:%M:%S$(if $(title),
# Stream it out
host = "localhost", port = 8000,
password = "dontpanic", mount = "music.mp3",
name="myStation Music Service", description="This is the myStation
 ↪music stream. Add some information about your station's automated
host = "localhost", port = 8000,
password = "dontpanic", mount = "music.ogg",
name="myStation Music Service", description="This is the myStation
 ↪music stream. Add some information about your station's
 ↪automated programming.",
host = "localhost", port = 8000,
password = "dontpanic", mount = "music.opus",
name="myStation Music Service", description="This is the myStation
 ↪music stream. Add some information about your station's
 ↪automated programming.",
host = "localhost", port = 8000,
password = "dontpanic", mount = "stream.mp3",
name="myStation Main Stream", description="The myStation main stream.",
name="myStation Main Stream", description="The myStation main stream.",
 ↪description="The myStation main stream.",

Multiple Music Playlists

You may wish to set up multiple
music playlists, perhaps with different types of music, and change the
frequency at which songs from each playlist are played. To do this,
create directories under music for each playlist, named music2, music3 and so on.
Then just copy the music1 line in the music playlists section of
main.liq, changing the reference to music1 accordingly.

To insert songs randomly from the new playlist every n songs in the stream, add
a line below radio = random([music1]), where
n represents the approximate number of songs to play
before inserting a song from the new playlist:

radio = random(weights = [1, n],[music2, radio])

Here’s an example with three music playlists:

# Music playlists
music1 = playlist("~/music/music1")
music2 = playlist("~/music/music2")
music3 = playlist("~/music/music3")
radio = random([music1])
radio = random(weights = [1, 6],[music2, radio])
radio = random(weights = [1,12],[music3, radio])

File-Based Playlists

In the base configuration, Liquidsoap
will search the directory ~/music/music1 recursively for songs to
play. However, you also can give Liquidsoap a newline-delimited text
file of paths to songs, either locally on your system or on the web. To
do this, simply change the path to a directory to a path to your text
file, like this:

music1 = playlist("~/music/music1.pls")

Sequential Playback

By default, Liquidsoap plays tracks in random
order. If you want to play tracks sequentially, add
to your playlist definition, like this:

music1 = playlist("~/music/music1",mode="sequential")

Instead of using random (for example, when adding other playlists or jingles),
use rotate:

radio = rotate(weights = [1, 7],[jingles, radio])

Sequential playback is best combined with file-based playlists as they
both give you total control over the order in which tracks are played
by Liquidsoap.

Compression and Normalization

If you’d like to add a more
«radio-like» sound to your automated programming, Liquidsoap supports
automatic compression and normalization. To compress and normalize the
tracks of a playlist or input.harbor live stream, wrap it in an
operator, like so:

music1 = nrj(playlist("~/music/music1"))

Talking Over Automated Programming

You can add a mountpoint allowing you to
talk over the automated programming, which will have its volume reduced
while you’re connected. Add the following to your configuration above
#Add support for live streams. The automated programming volume will
be changed to 15% of normal while the mic is connected; change
p=0.15 to adjust:

# Talk over stream using microphone mount.
radio = smooth_add(delay=0.8, p=0.15, normal=radio, special=mic)

Finishing Up

Edit the configuration as necessary, then save and close the file. Record
a file to ~/music/default.ogg; this file will be played when Liquidsoap
cannot find other tracks to play. The file should tell listeners that
the stream is down and give them information for contacting you to
notify you of the problem. Populate the playlist(s) with music, then
start Liquidsoap with the following command:

sudo systemctl start liquidsoap

Enable it on boot:

sudo systemctl enable liquidsoap

Once Liquidsoap is started, visit in a web browser
(where is the fully qualified domain name of your server). If
your system is configured properly, music.mp3, music.ogg and music.opus
will appear, playing automated programming. Also, stream.mp3, stream.ogg
and stream.opus will play automated programming unless a live stream
is connected.

If Icecast appears but no mountpoints are listed, check the Liquidsoap
logs at liquidsoap-daemon/log/run.log for errors. If Icecast doesn’t
load, restart it with systemctl restart icecast2.

To broadcast a live stream through your server, you will need a
compatible source client. For Windows, I recommend Altacast.
For Mac users, I suggest Ladiocast, available in the Mac
App Store. For Linux, install DarkIce through your system’s package
manager. On iOS, I recommend iCast. On Android, I suggest Cool Mic. In
all cases, use the following configuration:

  • Host: your server’s fully
    qualified domain name.

  • Port: 8080

  • Mount (mountpoint): live (or /live)
    for a live stream.
    If you enabled the ability to talk over automated
    programming, replace live with mic to talk over the music.

  • username:
    source (some clients don’t prompt for a user name, in which case, source
    is the implied default).

  • password: dontpanic1764 (or the password you
    specified in the input.harbor configuration).

You can stream in Ogg Vorbis
or MP3. Ogg Opus may or may not work, depending on your source client.

Liquidsoap offers control via TCP (over telnet or similar). The base
configuration presented in this article enables a song request system
and the ability to skip tracks on demand. By default, this interface is
available only to users on the local system. The telnet protocol does not
support authentication. If you want to make song request functionality
available to your users, you’ll need to write a program or script
customized for your station that interfaces with Liquidsoap.

Connect to Liquidsoap via telnet, like so:

telnet localhost 1234

Once connected, you can request a song with the following, where
uri is an absolute path to an audio file on your system or
a URL of an audio file on the internet:

request.push uri

To skip the currently playing song
and immediately play the next one, simply type skip.

For a list of all available commands, type help,
or type help followed by the name of a command for usage information on
a particular command.

To end your session, type quit.

In addition to Liquidsoap’s telnet interface, Icecast also has a web-based
administrative interface that you can use to view listener statistics, kill
Liquidsoap’s streams or move listeners among mountpoints. Access it at (where is your server’s fully
qualified domain name). Use the admin-user and admin-password you set
in icecast.xml.

At this point, you now have a fully functional streaming server that
should fit the needs of most users. However, Liquidsoap is extremely
flexible, allowing for more exotic setups for special use cases. Refer to
the Liquidsoap
for information
on additional language features that may be useful to you.

Live Stream Your Pets with Linux and YouTube!

Live Stream Your Pets with Linux and YouTube!


Shawn Powers
Thu, 10/26/2017 – 06:53

Anyone who reads Linux Journal knows about my fascination with
birdwatching. I’ve created my own weatherproof video cameras with
a Raspberry Pi. I’ve posted instructions on how to create your own
automatically updating camera image page with JavaScript. Heck, I even
learned CSS so I could make a mobile-friendly version of BirdCam that
filled the screen in landscape mode.

Recently, however, I’ve finally
been able to create an automated system that streams my BirdCam live
over YouTube. It starts when the sun comes up and stops when the sun
goes down. And thanks to some powerful open-source software, I never
have to touch the system!

Some of the tools I describe here have been
covered in other articles, but this is the first time I’ve been able to
create a stream that anyone can see utilizing bandwidth Google pays for!

Figure 1. Birds are always camera-shy. If you watch long enough, however,
they come and steal peanuts!

My List of Ingredients

First off, I want to be clear about what sort of hardware and software is
required in order to accomplish something similar to what I’m doing:

  • A Linux computer: if you plan to use USB cameras, this needs to
    be a physical computer. If your video source is network-based, this
    can be a virtual machine on your network. A Raspberry Pi isn’t really
    powerful enough for the video work that has to be done, unless maybe
    it’s low-resolution. I have an old i5 CPU running at 1.6GHz, and it’s
    more than enough.

  • A video source: this can be pretty much any video source you have
    at hand. If you plan to use a USB webcam, you’ll need to be sure you
    are using a physical Linux computer as noted above. I’ve used USB,
    MJPEG over http (see my old BirdCam articles), cheap wireless security
    cameras that have an RTSP stream, and most recently, I started using
    UniFi video cameras. In fact, if you are considering purchasing outdoor
    video cameras for a project like this, I can’t recommend UniFi cameras
    enough. They are PoE, HD and the free software handles recording and
    provides RTSP streams that have both HD video and top-notch audio.

  • A YouTube account with Live Streaming enabled: you’ll need to verify
    your account
    and then enable live
    streaming here.
    It’s not a
    difficult process, but without following those steps, you won’t be able
    to use the free service.

  • Open Broadcaster Software: I’ve tried multiple ways to use a CLI solution
    to stream directly to YouTube with FFmpeg or mencoder, but I’ve never been
    able to make it work consistently. I was hesitant to use OBS, because it’s a
    GUI solution and doesn’t have a CLI interface, but I worked around that
    problem, and I’m actually happy to have the GUI now.

  • A web server to host your embedded channel: you could just share the
    URL to your YouTube channel, but embedding is much cooler, because you
    can integrate it into your own site.

  • Enough upstream bandwidth to support 1.5–2mbps while streaming: since
    YouTube is going to redistribute, the local bandwidth requirements
    don’t change regardless of how many people are watching your stream. For
    some folks (like me, unfortunately), sacrificing that much bandwidth is
    difficult and sometimes causes issues. Just know that it takes a small,
    but not insignificant amount of constant upstream bandwidth to stream
    live video. That should be obvious, but it’s something to consider.

  • A few other utilities like crontab and sunwait: the latter is only if
    you want to time your streams with sunrise and sunset. And, crontab is
    needed only if you want to automate the starting and stopping. Those touches
    really make a difference for me though, so I encourage you to consider it.

Gather Your Info


In order to live stream, you’ll need a few bits of information. As
I mentioned above, you’ll need to verify your account to turn on streaming. Then you’ll need to get your streaming key (Figure 2). It’s
important that you not share the streaming key, because it acts like
your authentication. If others get your key, they can stream to
your channel, even without your user name.

Figure 2. That’s not my real streaming key, just FYI.

The other bit of information you’ll need from YouTube is your
channel ID. It’s not easy to find the channel ID, but if you
want to embed your video, you’ll need it later. Head to
this page, and find the
line that
looks like, «YouTube Channel ID: UCbUTB3bVg3cmeyJUtUC9DPA» (your channel
ID will be different from mine). The long string of text is your channel
ID, copy that somewhere easy to find.

Video Camera Feeds:

I can really give you only hints about what to look for here. You need
to find the streaming video feed coming from your camera. Make sure you
don’t use the web page that has the stream embedded (most cameras have
a rudimentary web server that embeds the stream). You need the raw feed
itself. Google or the user’s manual will be your best bet for figuring
out the raw stream URL.

I have an Onvif-compatible video camera that has an MJPEG stream URL
that looks like this:

One of my Foscam cameras requires a user name and password in the URL in
order to get the stream. It looks like this:

And my new UniFi cameras actually use an RTSP URL that comes from the
UniFi server instead of from the cameras directly. It looks like this:

The point I’m trying to make is that finding your video camera’s
streaming URL often is challenging. If you do it before you start, it
can save hours of frustration. An easy way to test if you’ve found the
correct URL is to try opening it in VLC. I haven’t found a video camera
that VLC can’t view, so if it complains about an invalid video source,
you probably don’t have the correct URL. Google, along with your camera’s
model number, is probably the best way to figure it out.

The Software

There are many scripts online claiming to stream from a camera source to
YouTube using FFmpeg. I’m sure they work for someone, but I’ve never
gotten them to work, no matter how many settings I tweak. In fact,
I gave up for quite a while because I didn’t want to rely on a GUI
interface to stream. I wanted my server to do the dirty work and do it
without my interaction. One day recently, however, I discovered that
Open Broadcaster Software (OBS) supports command-line flags for starting
streaming. That means I could have the server start streaming without
the need to «click» anything.

One problem I had to overcome was the lack of the X Window System on my BirdCam
server. There’s no monitor connected to the server, but in order
for OBS to work, it has to have a logged-in GUI desktop. I hooked up a
monitor long enough to get a GUI installed and then set the system
to log in automatically. I also disabled all power-saving features for
the monitor, because I wouldn’t have one logged in anyway. Once it was
set up, I installed TeamViewer so I could control the system
remotely if I needed to. There have been some issues with TeamViewer’s security
recently, so it might not be the software you choose for controlling the
server, but it’s what I have installed, and it works. Figure 3 shows my
«server» controlled remotely via TeamViewer.

Figure 3. I don’t normally have the security camera to my cat’s litter
cave on my live stream, but I wanted to show multiple cameras.

Installing OBS is simple. Head over to the OBS

and download the
latest version, or simply install their PPA if you’re using Ubuntu. The
software has matured since I last mentioned it, and I didn’t have any
problems with dependencies, even when connecting over a remote session.

OBS also has the great feature of saving your last-used session. That
means once you set up your cameras, you don’t have to worry about
readjusting them on the next launch. OBS just uses the same settings you
had before. If you look back at Figure 3, you’ll see there are multiple
cameras added to the preview window. Without the need to save a layout,
OBS just remembers from launch to launch how you had the cameras positioned.

In order to get the best results, you need to tweak a few OBS settings.
Click the settings button, and then head over to
the Video tab (Figure 4). This is a little confusing, but you have two
different resolutions to set. The «canvas» is how big you want OBS to
show on your preview window. The «output» resolution is what it scales
your video to for streaming and recording. I just set them both to 720p,
because I figure scaling takes CPU. You also set the frames per second
(FPS) for the output video. I use 10FPS with the 720p size. You can
adjust this if you want 1080p, or down if you don’t have bandwidth.

Figure 4. The resolutions are flexible, but I like to keep it simple.

Next, click on the «Output» tab (Figure 5). My settings are visible, and
I recommend keeping them close to mine, except for the bitrate of the
video and audio. If you want higher quality video (and you can afford
the bandwidth), this is where you set the average upload speed. You
also can change the audio quality if you want higher quality. Keep in
mind that the resolution you chose in the last step will work with the
bandwidth you selected here to give you the video quality users will
see. A video rate of 1500 (measured in kbps) works well with my 10FPS
and 720p resolution. But if you try to stream 1080p, 30FPS video with
1500kbps, it’s going to be really poor quality video. You’ll have to
experiment to find the sweet spot.

Figure 5. 1500 is the maximum my current internet connection can handle.

The «Stream» tab is where you configure the streaming service you want
OBS to use (Figure 6). You should be able to select YouTube and then paste
that stream key you got from YouTube earlier. (This is
not the channel
ID; it’s that hidden key from back in Figure 2.) Once entered, you shouldn’t
need to make any changes in settings. OBS will keep all the settings,
including streaming information.

Figure 6. It’s truly amazing how well OBS does with YouTube streaming.

All that’s left is to add the camera(s) to your preview screen. This is
the nicest feature of OBS, well apart from actually being able to stream
to YouTube. The setup is drag and drop, and you can resize cameras,
overlap cameras and arrange them however you want. Since OBS supports
so many types of inputs, you can get crazy with text overlays and so on. To
add a network camera, click the + at the bottom middle of the main
window, and select «media source» (Figure 7). Then uncheck
«local file»
and enter the camera URL in the «input» field (Figure 8). Once you click OK,
your camera should appear on the preview window, and you can resize and
move it. The interface also allows you to crop the section of the video
you want to use. It’s very powerful and incredibly
user-friendly. Plus,
as I mentioned earlier, OBS stores all your tweaks automatically,
so the next time you start it, you’ll get the same arrangement.

Figure 7. Media source isn’t obvious as the choice for network cameras.

Figure 8. Be sure to uncheck the «local file», or you won’t have an
input field.

Once you have your camera(s) set up, you can decide whether you want
to include audio if your camera supports it. The audio levels should
appear in the column next to the list of cameras. Then just click «Start
Streaming» to send your stream live to YouTube. It takes 30 seconds or
so to show up in the YouTube dashboard, but now is the time to make sure
streaming works.


I could just leave OBS running 24/7 and have it stream my bird feeders all
night. Honestly, I’m not sure how YouTube would handle a 24/7 stream, but
I don’t want to do that anyway. I not only want to automate the starting
and stopping of OBS, but I also want to make sure that if something crashes,
it starts back up the next day without me needing to fix it. Cron was
the obvious way to manage that, but since OBS is a GUI program, cron
proved to be challenging. In the end, I was able to include environment
variables in my crontab, and things worked smoothly. Here’s what my OBS
part of crontab looks like. Check it out, and I’ll explain it afterward:

@reboot sleep 10; obs --startstreaming
0 5 * * * /usr/local/bin/sunwait civ up 45.3733N 84.9553W;
 ↪obs --startstreaming
0 16 * * * /usr/local/bin/sunwait civ down 45.3733N
 ↪84.9553W; pkill obs

First off, setting the DISPLAY environment variable
to :0 means that
crontab can launch a GUI application on the current desktop. I was
embarrassed when I realized how easy it was to get cron to launch GUI
apps. It is important to note that the user must be logged in, however.

The @reboot line starts OBS when the system boots. The simple
--startstreaming flag tells OBS to launch and immediately start
streaming. It’s awesome. Really, if I had to figure out a way to automate
actually clicking a button, we probably wouldn’t be doing this project

The next two lines are a little confusing. First off, I have the program
«sunwait» installed. It’s an old program, but it’s so
I can’t
believe it’s not in every distribution by default. I’ve mentioned it
before in BirdCam articles, but basically, it’s a C program that determines
sunrise and sunset based on your longitude and latitude. The last version
was released in 2004 (seriously), but it still compiles. You can get
the source here.

Anyway, those two cron lines tell the server to start and stop OBS
at sunrise and sunset. At 5AM, I tell sunwait to «wait» until the sun
rises. It literally just waits until sunrise and then ends. Once it ends,
OBS is started up. Then at 4PM, I tell sunwait to wait until sunset, and
after the sunwait program ends, kill stops OBS. Why 5AM and 4PM? Well,
in my part of the world, the sun never rises before 5AM and never sets
before 4PM. There is the potential problem that if I reboot my server
after 4PM, it will stream all night. But that potential problem doesn’t
concern me enough to make the logic more complicated.

Since my server doesn’t have a monitor or keyboard connected, a random
GUI application starting and stopping in the middle of the screen doesn’t
affect anything. Since I connect to my server’s desktop only when I
want to make a change to OBS, it’s actually convenient that it’s always
running front and center on my desktop! I couldn’t be happier with the
current live stream setup.

Embedding the Stream

Not long ago, YouTube made a change so that every time a live stream
starts, it gets its own embed code. That means if you simply use the
«share» button on the live stream to get the embed code, it will work
only for that current streaming session. For me, that means the next day it
would show a recording of the previous day, but not the live stream. I’ll
be honest, that quiet change was very frustrating! Thankfully, there is
a way to embed the actual live stream, so that any time you start live
streaming, it becomes active—that’s where the Channel ID you got earlier
comes in.

Here is the embed code for my live stream at»>:

Obviously, you’ll need to make the changes for your own channel, but
it should be clear what the various things mean. I stuck with the 720p
size even on my embedded page. Since this is embed code, you don’t have
to put it on its own page like I did; you could embed a tiny resolution
version on your blog, for instance.

Setting up the live stream through YouTube is nice for several
reasons. One, your bandwidth requirements don’t change even if you have
10,000 viewers. Also, since it’s YouTube, you can «cast» the video to
a television or Chromecast device and show off your channel to your
friends. I still hope to get more cameras and maybe set up camera
rotation on multiple bird feeders, but for right now, I couldn’t be
happier. Enjoy!

Live Stream Your Pets with Linux and YouTube!

Anyone who reads Linux Journal knows about my fascination with
birdwatching. I’ve created my own weatherproof video cameras with
a Raspberry Pi. I’ve posted instructions on how to create your own
automatically updating camera image page with JavaScript. Heck, I even
learned CSS so I could make a mobile-friendly version of BirdCam that
filled the screen in landscape mode.

Working with YouTube and Extracting Audio

Working with YouTube and Extracting Audio


Dave Taylor
Tue, 10/10/2017 – 06:48

In my last few articles, I’ve been exploring the capabilities of ImageMagick,
showing that just because you’re working on a command line
doesn’t mean you’re stuck processing only text. As I explained,
ImageMagick makes it easy to work
with images
, adding
and analyzing
content far more accurately than with the standard Linux
file command,
and much, much more.

Continuing in a similar vein, I want to look at audio and video in this
Well, maybe «listen» to audio and «look» at video, but
again, I’m still focusing on the command line, so in both instances,
player/viewer apps are required.

YouTube to MP3 Audio

As someone who watches a lot of lectures online, I’m also intrigued by
the online services that can extract just the audio portion of a YouTube or
Vimeo video and save it as an MP3. Listening to a lecture while driving is
far safer than trying not to watch a video on the move, for example.

Since there are so many live concert performances online, many people also
like to use a video-to-MP3 service to add those songs to their music libraries.

Note: be leery of copyright issues with any download and conversion of content.
Just because it’s on Vimeo, YouTube or other online service,
doesn’t mean you have permission to extract the audio or even download
it and save it on your computer.

Let’s start with the most basic functionality: downloading a video from
YouTube so you can watch it on your Linux system. There are a lot of
browser plugins and even websites devoted to this task, but who wants to
risk malware or be plagued by porn site ads? Yech.

Fortunately, there’s a terrific public domain program called youtube-dl
on GitHub that covers all your needs. At its most basic, it lets you
download video content from YouTube and a variety of other online video
repositories, but as you’ll learn, it can do quite a bit more.

You can grab a copy for your system

Let’s start by downloading a copy of one of my own YouTube videos.
It’s a review of the splendid 1More quad-driver headphones, and its URL

As an aside: I have a YouTube channel where I review consumer electronics
and gadgets. You should subscribe! Find all my videos at

YouTube has a bunch of ways it can assemble a URL, however, including using
its URL-shortener, but fortunately, youtube-dl can handle the

Downloading a copy of the video to the current working directory is now as
simple as:

youtube-dl ''

The full output of the command is a bit, um, hairy, however:

$  youtube-dl ''
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
WARNING: Requested formats are incompatible for merge and
will be merged into mkv.
[download] Destination: 1More Quad Driver In-Ear Headphones
[download] 100% of 118.74MiB in 02:49
[download] Destination: 1More Quad Driver In-Ear Headphones
[download] 100% of 4.81MiB in 00:03
[ffmpeg] Merging formats into "1More Quad Driver In-Ear
Headphones Reviewed-BFL1E77hTHQ.mkv"
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f137.mp4 (pass -k to keep)
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.f251.webm (pass -k to keep)

You can wade through the output messages, but it’s the message from
companion open-source program ffmpeg that’s most important:
merging formats into ... mkv.

In other words, the download format of the video is MKV by default. MKV is
part of the increasingly popular Matroska Multimedia Container format, and
it works with a lot of video players (including VideoLan, aka VLC, my favorite
cross-platform video player).

A quick ls reveals the result and that the default filename is taken from
the title of the video, something that might not be particularly desirable:

$ ls -lh *mkv
-rw-r--r--  1 taylor  staff   124M Jan 31 16:56 1More Quad
Driver In-Ear Headphones Reviewed-BFL1E77hTHQ.mkv

Do you prefer to specify the output name and have the output file in MP4 (MPEG4)
format instead? That’s doable:

$ youtube-dl -o 1more-review.mp4 -f mp4 \
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
[download] Destination: 1more-review.mp4
[download] 100% of 57.63MiB in 00:27

As a bonus, you get less ominous informational messages from the program
too, so it’s cleaner. And the output, sure enough, is in MP4 format:

$ ls -lh *mp4
-rw-r--r--@ 1 taylor  staff  58M Jan 31 16:57 1more-review.mp4

As a second bonus, it’s also more efficient in its video encoding, so
the MP4 version of the downloaded video is only 58M as opposed to the 124M
of the MKV-merged version.

So how do you watch it? Most likely, do a double-click and it’ll be up and
running, as shown in Figure 1.

Figure 1. Downloaded YouTube Video Playing in Ubuntu Player

That’s easy enough, but the original goal was to be able to extract just the audio
component of a YouTube video, so let’s look at that task.

Downloading Just the Audio Track

Since I’ve already started to delve into the command-line options for
the youtube-dl program, it’s not a leap to find out that there’s
yet another command-line option that lets you save just the audio portion
of a video:

$ youtube-dl -x --audio-format mp3 \
[youtube] BFL1E77hTHQ: Downloading webpage
[youtube] BFL1E77hTHQ: Downloading video info webpage
[youtube] BFL1E77hTHQ: Extracting video information
[youtube] BFL1E77hTHQ: Downloading MPD manifest
[download] Destination: 1More Quad Driver In-Ear Headphones
[download] 100% of 4.81MiB in 00:07
[ffmpeg] Destination: 1More Quad Driver In-Ear Headphones
Deleting original file 1More Quad Driver In-Ear Headphones
Reviewed-BFL1E77hTHQ.webm (pass -k to keep)
$ ls -lh *mp3
-rw-r--r--  1 taylor  staff   4.0M Jan 31 18:22 1More Quad
Driver In-Ear Headphones Reviewed-BFL1E77hTHQ.mp3

That’s easy enough, and the output is delightfully small: 4MB total. The problem is,
there’s the same awkward naming issue, so the addition of -o
definitely will be a win. But, really, youtube-dl makes
these tasks trivially easy, as long as you’re willing to figure out all
of its command-line options.

Writing a Wrapper Script

Instead of worrying about the obscure command-line flag notation, let’s
just write a script that does the heavy lifting for you. I’m going to
call it ytdl for «youtube download», and by default, it’ll accept
just a URL and output an MP4 format video file that has the same name as
the YouTube shortcut (for example, the above video would become BFL1E77hTHQ.mp4).

Add a second parameter, and that becomes the output filename. Specify the
-a flag, and it saves audio output only, in MP3 format instead.

Let’s start with a usage block if the user forgets to specify anything
or just needs a simple reminder:

if [ $# -eq 0 ] ; then
  echo "Usage: $(basename $0) {-a} YouTubeURL {outputfile}"
  echo "   where -a extracts the audio portion in MP3 format"
  exit 1

That’s easy enough. The script is also going to use some predefined combinations
of flags to make it easier to write:

audioflags="-x --audio-format mp3"
videoflags="-f mp4"
flags=$videoflags       # default set of command flags
audioonly=0             # default is audio + video

If the user specifies the -a flag,
audioonly will be set to true (that is, 1),
and the default flags will switch from video to audio:

if [ "$1" = "-a" ] ; then

You’ll recall that the shift command moves all the parameters
«down» one to the left, so $2 becomes
$1 and so on. It’s an easy way to
process and discard parameters in a script, of course.

The biggest block of code creates a default output filename from the
YouTube URL:

if [ $# -eq 1 ] ; then
  # no output filename specified
  outfile=$(echo "$1" | cut -d= -f2)
  if [ $audioonly -eq 1 ] ; then

This isn’t the most robust code, because it assumes that the URL
specified is in a format like the examples used herein,
youtube-yadda-yadaa?value=shortcode. It extracts the shortcode and simply
appends an appropriate filename suffix. There are better ways to do this,
but that’s okay, this’ll work for now. Just realize that your
output format might be a bit weird if you have a very different type of
YouTube URL or a URL from another site.

And, finally, the actual invocation of the
youtube-dl command:

$youtubedl $flags -o "$outfile" "$1"

That’s it! Now you can download a video as simply as:

$ ytdl '' wiper.mp4

And an audio portion with:

$ ytdl -a ''

Nice, eh?

I’ve way overrun my space for this column, but this is such a fun and
simple script atop a terrific, powerful program, that it’s worth it,
right? And now you know how to make YouTube work for you, rather than
vice versa!

YouTube on the Big Screen

YouTube on the Big Screen


Shawn Powers
Wed, 09/20/2017 – 10:32

For years I’ve been jealous of folks with iOS devices who could just send
their phone screens to their Apple TV devices. It seems like the Android
screen-mirroring protocols never work right for me. My Sony Xperia has
multiple types of screen mirroring, and none of them seem to work on my
smart TVs or Roku devices.

YouTube is a completely different story. It doesn’t matter if I’m on a
laptop, iPhone, Android device or Chromebook, I can «cast» the video
to any of my Roku devices or smart TVs without any problems at all. It
works and works well. The great part about casting is you can shut off
the connection from the sending device, and it keeps playing! Because 95%
of the stuff I want to display on the TV from my phone is YouTube videos,
I couldn’t be happier. Plus, I can check email on my phone while the
family watches the latest «Bad Lip Reading» video on the big screen! Take
that Apple TV!

Nativ Vita

Nativ Vita


James Gray
Mon, 08/21/2017 – 08:38

The motto «open to anything» underpins Nativ’s development philosophy
on all of its audio solutions, including its new Nativ Vita, «the world’s
first High-Resolution Music Player» and touchscreen control center that is
designed to function as the central access point for one’s entire music

This philosophy is evident in Nativ Vita’s Linux and open-source
internals, offering advantages like support for virtually any music service—even lesser-known and regional services like Jango Radio, KKBox and Paradise
Radio—and extensibility far beyond pure audio applications. Naturally, Nativ Vita
supports mainstream music services like Apple Music, SoundCloud, Vevo, Spotify,
TIDAL, Pandora and Amazon Music, among others.

Nativ Vita can store up to 4TB of
music on its internal hard disk drives or SSDs and can access remote files on a PC,
NAS or smartphone. Wireless streaming to multi-room speaker systems is achieved
utilizing popular solutions like SONOS and Bluesound and to high-end headphones
via Bluetooth aptX. A high-end digital output stage with myriad outputs ranging
from AES/EBU to USB Audio Class 2.0 connect the Vita to an amplifier or USB DAC
for best-in-class sound performance.

The Post-TV Age?

The most basic cable package from Charter (Spectrum?) costs me more than $70
per month, and that’s without any equipment other than a single cable
card. It’s very clear why people have been cutting the cord with cable
TV companies. But, what options exist? Do the alternatives
actually cost less? Are the alternatives as good? more>>

The Post-TV Age?

The Post-TV Age?


Shawn Powers
Tue, 08/15/2017 – 09:33

The most basic cable package from Charter (Spectrum?) costs me more than $70
per month, and that’s without any equipment other than a single cable
card. It’s very clear why people have been cutting the cord with cable
TV companies. But, what options exist? Do the alternatives
actually cost less? Are the alternatives as good? I’ve been trying to
figure that out for a few months now, and the results? It depends.

The idea of cord cutting isn’t new. For years, people have been
severing their ties with cable companies in order to save money. The
ever-persistent question is this: how do the options compare?

Real Time or On Demand?

When replacing cable TV, there are two main types of media in
question. Services like Netflix, Amazon Prime and Hulu are great, but
they don’t provide live television. In fact, depending on the show and
service, you might need to wait until the next day or even the end of
a season before your desired shows are available. You usually get the
advantage of no commercials, but the waiting often is unbearable if
you’re into television shows that end with cliffhangers.

It is interesting though, now that Netflix and Amazon have been so successful with
their streaming services, they’re beginning to get their own exclusive
shows. This means that not only are the shows not delayed, but they’re also actually
not available at all via cable TV! Admittedly that phenomenon is fairly
new (only the last few years), but it makes the case for streaming far
stronger. Why pay $70 per month and still not get to watch
Jessica Jones?

Also, many individual stations are starting to offer their own
streaming options, so the days of paying for cable so you can see a
particular HBO show are over. Broadcast networks are starting to offer
streaming options too, so if you’re just looking for the ability to watch
particular television shows, even paying for multiple online accounts
is cheaper than paying for cable—usually.

All Those Cable Channels…

Some of the biggest hurdles for cord-cutters are cable-only channels. I
have a relative who watches only shows on the History Channel. And my
mother-in-law couldn’t live without watching movies on the Hallmark
Channel. And everyone I know in real life is addicted to HGTV and its
tiny house program. Those channels aren’t big enough to support a full
streaming platform (or are owned by actual cable companies, so they won’t
offer a non-cable alternative). So what’s a cord-cutter to do?

Until recently, not much. Now, however, there are three really good options
for streaming cable television stations, and one is almost really good. Those
options aren’t exactly cheap, and they’re mostly US-only, but they’re
far less expensive than cable TV. The three options each have their quirks,
but any of them are worth looking into if you have reliable internet
speeds that aren’t dependent on cable TV bundling. Currently, the three main
options are Sling TV, PlayStation Vue and DirecTV Now.

Streaming Cable: Sling TV

Sling TV has been around the longest and is owned by Blockbuster
(yes, that Blockbuster!), who in turn is a subsidiary of Dish Network. It
has a large lineup of cable stations and several tiers of options that
include packages like premium cable channels. Depending on promotions and
where you live, the packages range from $20–$40 per month. If you live
in a big city, you also might get local broadcast stations (NBC, ABC,
CBS, PBS, FOX), but for most of the country, you get those channels
only «on demand», which means recordings of popular shows the next day.

Figure 1. Sling TV has been around a long time, but the lack of DVR and
video glitches make it less than stellar in my experience.

The technology details of Sling TV are a little confusing. If you
subscribe to the lowest tier, you can stream only one channel per account
at a time. That means if you are watching TV in your living room, you
can’t watch something else on your phone. If you subscribe to a
higher-priced tier, you can have up to three streams at once. Also,
although the streams
usually are good quality, my anecdotal experience shows that there are
a few more artifacts and glitches with Sling TV than with the other options,
but nothing that makes it a showstopper. (I get glitches with my cable
television too, so nothing is perfect.)

There’s a free trial with Sling TV, so it’s worth checking out. Just
be sure to cancel it before your credit card auto-renews at the end of the
trial, unless you decide to keep it. Also, because it’s been around for a
long time, Sling TV has apps on multiple platforms. Xbox users can install
Sling TV, along with Android TV and Roku users. Like most streaming
services, Roku does a great job of staying vendor-neutral, which means
it usually can provide services regardless of who is providing

PlayStation Vue

PlayStation Vue is a bit more of a surprise, since Sony PlayStation
is synonymous with gaming rather than television. Its offerings
are impressive, however. The lineups are similar to Sling TV, but
the breakdowns are a little different. The lowest-price service is around
$30 per month, with other tiers available that add more channels. Sony
gives you a price break if you’re not in one of the cities that has local
channels available, so for me in rural Michigan, it’s cheaper than if I
lived in Chicago. (That means I don’t get local channels though, which
is frustrating.)

Figure 2. PlayStation Vue is remarkable, until it’s not. The video
quality is amazing, and the DVR is superb. The geolocation frustrations
along with PS4 console problems make it difficult to love.

Although the slightly higher price seems frustrating, the technology included
might make up for it. Not only can you stream to five devices simultaneously,
but it also provides «Cloud DVR», which automatically stores recorded
content for you. All you need to do is mark a program as a favorite,
and all episodes are saved for 30 days. It’s not possible to schedule a
timed event, but the DVR feature is extremely nice, and it provides a far
better experience than the live-only Sling TV.

The video quality with PlayStation Vue is
shockingly good. Whether
watching on a mobile device, a Roku or a PlayStation system, the video is
far more reliable in my anecdotal trials. The five streams means people can
watch TV in multiple rooms, and since Vue allows for individual profiles,
different family members can have their own DVR’d shows. The only really
big issue I’ve had with PlayStation Vue is that it’s not possible to
watch streams from the same account on two different PlayStation 4
consoles. I have a console in my office and a PlayStation Pro in the
living room, and it’s not possible to watch Vue on both devices. That is
particularly frustrating, because watching on multiple Roku units works
fine, but not on the actual Sony hardware! There’s also some frustration
with geolocation. Sony often thinks I’m not home, so it limits what I can
watch. I would understand if my IP address changed, but I have a static
IP address and I’m always connecting from home! (See the notice in Figure

DirecTV Now

DirecTV Now is the new kid on the block when it comes to cable TV
streaming. The packages are similar to the other services I mentioned, with some
initial low-priced options available to entice users away. (Note: with all
these services being contract-free, the potential for moving in order to
save a few bucks is very legitimate!) DirecTV Now has similar limitations
regarding live broadcast stations (that is, at the time of this writing there aren’t
any available), but DirecTV Now has the additional limitation that even
on-demand content from CBS isn’t available. The kerfuffle that DirecTV and
CBS have been having extends to the streaming service as well.

Figure 3. DirecTV Now is the new kid on the block. The $35/month is a trial
cost and likely will increase before this article is published.

I haven’t personally used the DirecTV Now service, because none of my
devices currently are supported. (Apple TV is its main device, and you
can get one free if you pre-pay for three months of service.) I have friends
who’ve used it though, and they say the quality is very good. Like Sling
TV, however, it doesn’t currently have any DVR capability.

Since DirecTV Now is new, it’s not fair to criticize its lack of
hardware support yet. Roku streaming is slated for Q1 2017,
and it’s possible other non-competitors will get apps as well. As is
usually the case, Roku likely will be one of the premiere ways to watch
streaming cable TV service, because its compatibility will allow for
service-hopping without hardware reinvestment.

USTVnow, the Sort of Option

USTVnow is a service designed for US citizens living outside
the US and, therefore, unable to get US television. It’s a streaming
service that provides live network channels (ABC, CBS, NBC, PBS, FOX)
for free, and for a monthly fee, it adds a few cable channels (28 total)
and HD streaming as well. There is also some DVR service included with
the premium packages. Any time I’ve tried to use USTVnow inside the
US, it’s worked perfectly, so there aren’t any apparent geographical
restrictions. Honestly, on paper, it’s the best thing going.

Figure 4. I want to love USTVnow, and perhaps now that there is a paid
service, the reliability will improve. I just hope it’s able to keep
providing live broadcast channels in the US.

Unfortunately, the times I’ve used USTVnow, I’ve had lots of
glitches. Usually it’s during busy times (Super Bowl party, for instance)
that the service glitches, but since those are the times I want it to work
the most, it’s been a frustrating service. The pricing is competitive,
however, especially since the SD free tier is really free and provides
live broadcast stations. As with most services, Roku seems to be the
best way, apart from a browser, to consume USTVnow.

I want to love USTVnow. I have no idea how it’s able to provide
service in the US when the other options struggle to provide broadcast
stations. Hopefully, it’s not a loophole that will be closed, because
for some folks, it’s the only way to get broadcast channels at all,
even if they do live in the US.

Rabbit Ears

Yes, obviously using an antenna is a great way to get local television. In
fact, you can head over to and see what
channels are available in your area and what sort of antenna you’ll
need. The site even will tell you what direction to point your antenna for
the best signal. If you’re just looking for some old-fashioned television,
an antenna is often a good option. Plus, apart from the hardware, it’s
totally free.

Figure 5. «Up to 0 channels» is a sad thing to see; I hope your
location is better.

The problem is, even though I live in a (small) city, I get exactly
zero channels from my location. That is due to geography, because I live
on the side of a hill, but nonetheless, I can’t get any channels using
even a rooftop antenna. Even if you can, however, it’s worth considering
whether that sort of system is acceptable for you. I don’t want to switch my
input source on the television every time I want to watch TV. And TiVo has
spoiled me; I want to pause live TV. It’s possible to get something like
an HD Homerun device from Silicon Dust and convert your antenna signal
into a digital stream, but integrating that into your entertainment system
is often challenging. Plus, I had so much frustration with my HD Homerun
setup in our last house that I opted to just buy a cable TV subscription.

So OTA (over the air) channels are worth checking out, and for some
people, they are more than enough. For me, however, even if I could get
a good signal, I want more.

What about the Parade?!

If you live in a big city and can get local channels via services like
Sling TV or PlayStation Vue, things like watching the Thanksgiving Day
parade are possible. For me, the only way I can watch live events is
with the not-always-reliable USTVnow. And even those channels aren’t
local, so I can’t ever watch the local news. My big issue used to be how
to watch the Olympics, but thankfully, many streaming options
are available now. Still, watching the Thanksgiving Day parade is something I’ve done
my whole life, and without some way to see local channels, all the cable
channels in the world don’t help.

Because I have thousands of dollars invested in my TiVo infrastructure
(lifetime Roamio subscription and four TiVo Minis), I’m still paying for
the lowest tier of cable TV. I find that we almost never switch over
to the TiVo, however, so in the next few months, I might bite the bullet
and cancel cable TV altogether. For most folks, services like Sling TV,
PlayStation Vue and DirecTV Now provide more than enough service at a
fraction of the cost. So if you live in a big city or can live without
live broadcast channels, I urge you to give them a try. Each is available
with a free trial, and if you sort through the various pros and cons,
coming up with a satisfactory service is pretty easy.

If you’ve cut the cord (many of you I’ve spoken with already
have done so), I’d love to hear about your specific solution. Do you just
switch sources on your TV and use rabbit ears? Do you strictly Netflix
and chill? Have you sold your television and reverted to books? (I’m
often tempted.) Please let me know. I’d love to follow up with some
alternatives for folks like myself who are still struggling to cut
the cord.

Analyzing Videos for Fun and Profit

People’s phones and all of the various sensors that may be built in to them
is a
source of scientific data logging that almost everyone carries around.
Although the selection of sensors varies from phone to phone,
they almost all have a camera. In this article, I take a
look at a piece of software called Tracker that can be used to analyze
videos you take of experiments.