Get AWS MediaLive video duration after live stream ends - amazon-web-services

I'm using AWS MediaLive & MediaStore for live streaming and I'm looking for a way to get the duration of the final video, after the live stream ends.
I'm using HLS Output group type and I'm archiving it to S3. One way I was able to do this, is to get the m3u8 file which contains all segments and sum the duration of all the segments.
Is there any better way? Maybe by using MediaPackage ?
Thank you!

Using a VOD type HLS output is the best way, since the manifest of a VOD HLS rendition contains a list of all segments and the duration of each segment in the EXTINF tag. Adding EXT-X-PROGRAM-DATE-TIME tags to the manifest may also help you to determine the start time of the live event.
Any other option, such as trying to determine the start and end time based on the MediaLive channel channel start/stop, is not as accurate, since this does not take into account the fact that the source could start minutes if not hours after the channel start.

Related

Aws MediaConvert - Create one output video file with a single audio track and multiple video inputs

I’m working with Aws MediaConvert in order to create video-files concatenation.
I'm able for now to create concatenation of n videos in one output mpeg4 file, with or without audio "inside each video input".
What i'm looking to achieve is to create the same but with one single audio track for the whole video that i would import and muting each video inputs audio if there are.
I don't know if MediaConvert allows that (not found my case in Aws MediaConvert Documentation).
I made a small schema representing what i'm trying to achieve :
I figured out i can do that with two jobs, one that will concatenate all my video input and mute their audios if there are. And the second one merging the single audio track in the result of the previous one.
This solution however doesn't feel to be the best one.
Do you know if can achieve what i'm trying to do in one job with Aws MediaConvert and if yes, which settings have I to tweak ?
Many thanks in advance !
Maybe you can have look at this link, especially for the following part
If your audio is in a separate file from your video, choose the External file slider switch element and provide the URI to your audio input file that is stored in Amazon S3 ...
By choosing audio from external file and set proper timestamp offset, maybe you can combine your two jobs to one.

Portrait video converted to Landscape in AWS Elemental Mediaconvert

I'm using AWS 'Elemental MediaConvert' service to get the HLS format of the uploaded video. We are using this as Video-On-Demand service. Everything works fine. Video that is been uploaded in 's3-input' bucket will taken by lambda service and processed by boto3 elemental mediaconvert client. Out of the video will be stored in 's3-output' bucket. One problem is Portrait videos are appearing in Landscape mode in 's3-output' bucket and also when HLS url is played in mobile/browser.
Make sure you use the latest version of boto3 if you use it at all. Anyways
Add "Rotate": "AUTO" to VideoSelector in inputs. In this case, EMC will try to automatically rotate the video based on metadata if it's available.
These links were really useful for me:
List https://www.mandsconsulting.com/lambda-functions-with-newer-version-of-boto3-than-available-by-default/
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/mediaconvert.html
Well... In your place here is what I'd do... I'll go to the last "job"... Go to the "output" section. Then go to the output formats sub-sections... and set the size of the desired output Manually.
I don't think Elemental MediaConvert has presets for vertical video. It's a pretty new (awesome) product.
Good luck!

Video Streaming: MPEG-DASH , AWS cloudfront, dash.js

I am creating a video streaming application hosted on AWS. I have got mp4 which are hosted on AWS S3. To stream video files, I want to transcode mp4 to MPEG-DASH (mpd) format and store in a different AWS S3 bucket. I will be AWS cloudfront to stream above transcoded mpd files and use dash.js or videogular to stream on client side.
The problem I am facing is here how to transcode mp4 to mpd.(without using AWS transcoder, bit expensive). I was thinking to leverage AWS Lambda to listen the source S3 bucket and output to a different S3 bucket. But could not find a module to transcode programmatically(to convert it to Lambda function). Has anyone done it yet and would like to give some insight?
An mpd file is actually just a text based index file - it contains URLs to the video and audio steams but no media itself.
The media for MPEG DASH is stored in segments, for mp4 in a fragmented mp4 format.
If you want to create fragmented mp4 from mp4 yourself, then there are some tools which you can look at to do this, or even use as part of a batch process.
One example is mp4Dash (https://www.bento4.com/documentation/mp4dash/). You can see examples here on this link to convert a single mp4 file, or to convert multiple bit rate versions of a single file, which is more typical when using DASH for Adaptve Bit Rate Streaming (ABR - allows the client choose the bit rate of the next segment to download depending on the current network conditions):
Single MP4 input file
mp4dash video.mp4
Multi-bitrate set of MP4 files
mp4dash video_1000.mp4 video_2000.mp4 video_3000.mp4
Another example is mp4Box: https://gpac.wp.imt.fr/mp4box/dash/
Its worth nothing that there are actually multiple ways to stream DASH in AWS - Elastic Transcode can create MPEG DASH stream which you can stored and stream from S3, you can use cloud front and services like Unified Streaming or Wowza etc. Streaming is complicated so if this is for a high volume important service it may be worth looking at these and seeing if there is an option or combination which meets your needs without being too expensive.

How to distinct presets from AWS transcoding job if all providing same quality?

I am transcoding a video from any format to HLS formats using AWS Elastic transcoding service. I am using five presets in single job for adaptive bit rate.
If video is of high input quality then video transcodes in different outputs qualities like 224p,270p, 360p,540p,720p.
But if video is of low input quality then video transcodes in different output qualities like 224p,270p, 360p,360p,360p. For low input quality there is three similar output quality i.e. 360p,360p,360p which is unnecessary cost of transcoding. How to avoid two presets for output quality 360p from AWS elastic transcoding job? Want to generate only output quality like 224p, 270p, 360p.
You could use Lambda and mediainfo/ffmpeg to determine the resolution of the source and drop the file into a seperate bucket/pipeline for the appropriate encoding stack.
Though it may be overkill, here's an example of using mediainfo on lambda to extract and store the data in dynamo.

Get output frame rate from AWS elastic transcoder?

I've tried the get-job method to retrieve information about the frame rate.
But it seems that I can only specify the input frame rate. What I want to do is to set the input frame rate to auto and retrieve the frame rate from the output.
Does anyone know if this is possible or do I have to choose another transcoding service?
You can do it with Elastic Transcoder, but it takes two steps. You first must retrieve the preset ID used for the job. Then, retrieve that preset to get the frame rate that was used for the transcoding job.
Here are the docs for getting a job:
http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/get-job.html
And here are the docs for retrieving preset info:
http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/get-preset.html