# Thursday, February 25, 2021

GCast 105:

Analyzing a Video with Azure Media Services

Learn how to use Azure Media Services to apply Artificial Intelligence and Machine Learning to a video, analyzing such things as face detection, speech-to-text, object detection, and optical character recognition

Thursday, February 25, 2021 8:52:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 22, 2021

Episode 649

Richard Taylor on the Microsoft Revenue Recognition System

Richard Taylor is working on a system to process revenue received by tech giant Microsoft. He discusses the challenge in building and maintaining a large system like this and in migrating it to Azure.

Monday, February 22, 2021 8:43:00 PM (GMT Standard Time, UTC+00:00)
# Saturday, February 20, 2021

Tommy James and the Shondells turned out hit after hit in the 1960s. But James saw very little of the royalties generated by sales of his records. That money was controlled by crime boss Morris Levy, who signed a teenage James to a deal with his Roulette Records in 1966. The band went on to release two #1 records and  a dozen Top 40 singles over the next 5 years.

But Levy was notorious for non-payment of debts including tens of millions of royalties owed to James. James was forced to earn his money through constant touring and profited very little off the sale of his records.

Despite this betrayal, James and Levy maintained a close relationship throughout much of their lives. Levy was excellent at promoting James's music and James enjoyed a great deal of artistic freedom as Roulette's biggest star. James's career also benefited from Levy's strong-arm tactics: He would often bully songwriters into saving their best work for his artists.

Me, the Mob, and the Music: One Helluva Ride with Tommy James and the Shondells is Tommy James's story of life in the spotlight. It contains the usual anecdotes about women and booze and drugs that seem to be part of every rocker's life. But these stories are secondary to his interactions with Roulette and Levy.

The story climaxes in a gang war that sees Levy fleeing the country and James fearing for his life.

One wonders why James continued his relationship with Levy when he was treated so unfairly. Did he feel it was unsafe for him to leave? Was he a victim of Stockholm Syndrome? Did the career advantages of associating with Roulette outweighed the financial disadvantages?

One  wonders if the corruption at Roulette was a microcosm of the corruption in the entire music industry in the 1960s; and if that corruption continues today.

One wonders if Tommy James ever received all the royalties he was due.

Despite the unanswered questions, this book was an enjoyable read about an unlikely hitmaker and his adventures with the underbelly of the industry.

Saturday, February 20, 2021 9:49:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, February 18, 2021

GCast 104:

Sharing a Video Online with Azure Media Services

Learn how to use Azure Media Services to share a video on the web for streaming and/or for downloading.

Thursday, February 18, 2021 8:51:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 15, 2021

Episode 648

Julie Lerman on Entity Framework Core 5

Julie Lerman describes some of the new features included in EF Core 5.

Monday, February 15, 2021 8:38:00 AM (GMT Standard Time, UTC+00:00)
# Saturday, February 13, 2021

Alexander Portnoy has issues.

An overprotective mother left him straddled with guilt and an Oedipal complex. His childhood memories are dominated by unpleasant bodily functions - his father complaining of persistent constipation; his mother accidentally spilling a drop of menstrual blood on the kitchen floor; his own inability to wipe himself completely or to control his masturbation.

Portnoy was raised by Jewish parents, grew up in a Jewish neighborhood, attended a Jewish school, and all his friends were Jewish. As an adult, he became obsessed with seducing attractive non-Jewish women ("shikses", as he calls them). But Portnoy has no interest in a real relationship. When referring to his past lovers, he is more likely to call them by a nickname than to use their real name. He calls his latest lover "The Monkey" after a past sexual incident she confessed to him. This is just one way in which he dehumanizes women, treating them only as sex objects. The Monkey is absurdly ignorant, but Portnoy stays with her because she is beautiful and good in bed; Portnoy is overtly misogynistic, but The Monkey stays with him because she hopes that he will marry her.

Portnoy's Complaint by Philip Roth is a satirical confession of a 33-year-old sex addict, who recognizes his self-destructive behavior and feels extreme guilt over it; but is powerless to correct these flaws. Despite his numerous faults and our very different upbringings, I was able to relate to his life.

The story is humorous, but crude. It is crude, but humorous.

I feel a little guilty for enjoying it so much.

Saturday, February 13, 2021 9:22:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, February 11, 2021

GCast 103:

Encode a Video with Azure Media Services

Learn how to use Azure Media Services to encode a video into multiple formats, including support for adaptive streaming.

Thursday, February 11, 2021 9:50:00 AM (GMT Standard Time, UTC+00:00)
# Tuesday, February 9, 2021

In previous articles, I showed how to use Azure Media Services (AMS) to work with video that you upload. In this article, I will show how to broadcast a live event using AMS.

Before you get started, you will need some streaming software. For the demo in this article, I used Wirecast from Telestream. Telestream offers a free version, which is good for learning and demos but not for production, as it places a watermark on all streaming videos.

You will need to create an Azure Media Services account, as described in this article.

After the Media Service is created, navigate to the Azure Portal and to your Azure Media Services account, as shown in Fig. 1.

ams01-OverviewBlade
Fig. 1

Then, select "Live streaming" from the left menu to open the "Live streaming" blade, as shown in Fig. 2.

ams02-LiveStreamingBlade
Fig. 2

Click the [Add live event] button (Fig. 3) to open the "Create live event dialog", as shown in Fig. 4.

ams03-AddLiveEventButton
Fig. 3

ams04-CreateLiveEvent
Fig. 4

At the "Live event name" field, enter a name for your event.

You may optionally enter a description and change the Encoding, Input protocol, Input ID, or Static hostname prefix.

Check the "I have all the rights..." checkbox to indicate you are not streaming content owned by anyone other than yourself.

Click the [Review + create] button to display the summary page, as shown in Fig. 5.

ams05-CreateLiveEventConfirmation
Fig. 5

If any validation errors display, return to the "Basics" page, and correct them.

Click the [Create] button to create the live event.

When the event is created, you will return to the "Live streaming" blade with your event listed, as shown in Fig. 6.

ams06-LiveStreamingBlade
Fig. 6

Click the event name link to display the event details, as shown in Fig. 7.

ams07-LiveEvent
Fig. 7

Click the [Start] button (Fig. 8) and click [Start] on the confirmation popup (Fig. 9) to start the event.

ams08-StartButton
Fig. 8

ams09-ConfirmStart
Fig. 9

When the event is started, the event details page will show information about the input, as shown in Fig. 10.

ams10-LiveEvent
Fig. 10

The "Input URL" textbox (Fig 11) displays a URL that you will need in your streaming software. Copy this URL and save it somewhere. You will need it in your streaming software.

ams11-InputUrl
Fig. 11

For the next part, you will need some streaming software. I used Wirecast from Telestream. The user interface of the free demo version is shown in Fig. 12.

ams12-Wirecast
Fig. 12

The following steps are specific to Wirecast, but other streaming software will have similar steps.

Click the [+] button on the first layer (Fig. 13) to open the "Add Shot" dialog, as shown in Fig. 14.

ams13-Layer
Fig. 13

ams14-AddLayer
Fig. 14

I chose to share the image captured by my webcam, but you can share screen captures or videos, if you like. The image you are capturing will be set as a "preview". Make this same layer broadcast live by clicking the "Live" button (Fig. 15).

ams15-GoButton
Fig. 15

Now, configure your streaming software to send its live video to your AMS Live Streaming event. Select Output | Output Settings... from the menu to open the Output dialog, as shown in Fig. 16.

ams16-OutputSettings
Fig. 16

Select "RTMP Server" from the "Destination" dropdown and click the [OK] button to open the "Output settings" dialog, as shown in Fig. 17.

ams17-OutputSettings
Fig. 17

In the "Address" text box, paste the Input URL that you copied from the AMS Live Stream event. Click the [OK] button to close the dialog.

Your UI should look similar to the following.

To begin streaming, select Output | Start / Stop Broadcasting | Start All from the menu, as shown in Fig. 18.

ams18-StartOutput
Fig. 18

Your UI should look similar to Fig. 19.

ams19-Wirecast
Fig. 19

Return to the Azure Media Services live event. You should see a preview of what you are broadcasting from your streaming software, as shown in Fig. 20. Refresh the page if you do not see it. There may be a few seconds delay between what is captured and what is displayed.

ams20-LiveEvent
Fig. 20

Click the [+ Create an output] button (Fig. 21) to open the "Create an output" dialog with the "Create output" tab selected, as shown in Fig. 22.

ams21-CreateAnOutput
Fig. 21

ams22-CreateOutputDialog
Fig. 22

Verify the information on this tab; then, click the [Next: Add streaming locator] button to advance to the "Add streaming locator" tab, as shown in Fig. 23.

ams23-CreateOutput
Fig. 23

Verify the information on this tab; then, click the [Create] button to create a streaming locator and endpoint. You will return to the live event blades, as shown in Fig. 24.

ams24-StreamingEndpoint
Fig. 24

Click the [Start streaming endpoint] button, then click the confirmation [Start] button, as shown in Fig. 25.

ams25-StartStreamingEndpoint
Fig. 25

After the streaming endpoint is started, copy the "Streaming URL" textbox contents (Fig. 26). You will need this to create an output page for viewers to watch your live event.

ams26-StreamingUrl
Fig. 26

Create and launch a web page with the HTML in Listing 1.

Listing 1:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Azure Media Services Demo</title>
    <link href="https://amp.azure.net/libs/amp/2.3.6/skins/amp-default/azuremediaplayer.min.css" rel="stylesheet">
    <script src="https://amp.azure.net/libs/amp/2.3.6/azuremediaplayer.min.js"></script>
</head>
<body>
    <h1>Video</h1>
    <video id="vid1" class="azuremediaplayer amp-default-skin" autoplay controls width="640" height="400" data-setup='{"nativeControlsForTouch": false}'>
        <source src="STREAMING_URL"
                type="application/vnd.ms-sstr+xml" />
    </video>
</body>
</html>
  

where STREAMING_URL is the Streaming URL you copied from the live event textbox above.

Listing 2 shows an example with the URL filled in.

Listing 2:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Azure Media Services Demo</title>
    <link href="https://amp.azure.net/libs/amp/2.3.6/skins/amp-default/azuremediaplayer.min.css" rel="stylesheet">
    <script src="https://amp.azure.net/libs/amp/2.3.6/azuremediaplayer.min.js"></script>
</head>
<body>
    <h1>Video</h1>
    <video id="vid1" class="azuremediaplayer amp-default-skin" autoplay controls width="640" height="400" data-setup='{"nativeControlsForTouch": false}'>
        <source src="https://dgtestams-usea.streaming.media.azure.net/45fb391c-8e10-4d41-a0ab-a03e50d57afd/cb4a49d9-93ad-4bb1-8894-c3f0a9fb7d43.ism/manifest"
                type="application/vnd.ms-sstr+xml" />
    </video>
</body>
</html>
  

With the live event running, your web page should display something similar to Fig. 27.

ams27-WebPage
Fig. 27

If this is published on the web, viewers will be able to watch your live stream from just about anywhere.

Be sure to stop your live event when you finish broadcasting in order to avoid unnecessary charges.

In this article, I showed you how to create a live streaming event using Azure Media Services.

Tuesday, February 9, 2021 8:03:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 8, 2021

Episode 647

Kevin Pilch on gRPC

Kevin Pilch describes gRPC - an open source system for making remote calls across processes and/or machines - and the .NET Core implementation of this system.

https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-5.0
Monday, February 8, 2021 9:30:00 AM (GMT Standard Time, UTC+00:00)
# Sunday, February 7, 2021

2/7
Today I am grateful for the imagination of Jon Favreau.

2/6
Today I am grateful to learn from my teammates.

2/5
Today I am grateful to watch yesterday's snowstorm from my warm safe home.

2/4
Today I am grateful for a productive day yesterday.

2/3
Today I am grateful for:
-a chance to catch up with J for the first time in months
-Christina, who answered my questions about Photoshop and Lightroom

2/2
Today I am grateful for 3 years in my current home.

2/1
Today I am grateful to go to the gym yesterday for the first time in months.

1/31
Today I am grateful for online Mass.

1/30
Today I am grateful for home-cooked meals.

1/29
Today I am grateful to deliver my first presentation of the year last night.

1/28
Today I am grateful for technical support from co-workers.

1/27
Today I am grateful to be a guest yesterday on the Visual Studio Toolbox show.

1/26
Today I am grateful for all the interviews with interesting people I've scheduled for #TechnologyAndFriends

1/25
Today I am grateful for a visit to the Indianapolis Art Museum yesterday.

1/24
Today I am grateful for a walk around Zionsville and Carmel yesterday.

1/23
Today I am grateful for an upgraded hotel room.

1/22
Today I am grateful for funny memes.

1/21
Today I am grateful to see so much hope and optimism expressed by so many people about yesterday's historic events.

1/20
Today I am grateful for a call from my cousin Kevin last night.

1/19
Today I am grateful for my new drone.

1/18
Today I am grateful for the legacy of Rev. Dr. Martin Luther King, Jr, who understood that non-violence was not a weakness.

1/17
Today I am grateful for a much-needed mid-afternoon nap yesterday.

1/16
Today I am grateful to everyone who shared photos of their dogs yesterday.

1/15
Today I am grateful for dogs.

1/14
Today I am grateful to spend the past few evenings sorting through photographs and papers of my late mother.

1/13
Today I am grateful for lots of advice yesterday on how to cook pasta.

1/12
Today I am grateful to restaurants who have worked to make outdoor dining safer in Chicago winter.

1/11
Today I am grateful for my new cabinet/end table.

1/10
Today I am grateful for Indian food.

1/9
Today I am grateful for good health.

1/8
Today I am grateful for my new laptop.

1/7
Today I am grateful for dinner with Tim and Natale last night before they drive to Austin tomorrow.

1/6
Today I am grateful for a virtual lunch with Annie yesterday.

1/5
Today I am grateful for a regular exercise routine.

1/4
Today I am grateful to return to work after an extended vacation.

Sunday, February 7, 2021 3:03:11 PM (GMT Standard Time, UTC+00:00)