MediaLiveに打ち上げた映像からなるべく正確な時刻で動画クリップを切り出す - Harvest Job活用編 -
はじめに
清水です。先日、AWS Elemental MediaLiveに打ち上げた映像をAWS Elemental MediaConvertでタイムコードを基準にClippingすることで、時刻に対してなるべく正確な動画の切り出しができないか検証しました。以下ブログエントリにまとめています。
MediaLiveへのIngestの段階でタイムコードを埋め込むことが難しかったためMediaLive側でのタイムコード付与となりましたが、出力ファイルに対してMediaConvertのInput Clippingを行うことで時刻に対してなるべく正確な切り出しができることが確認できました。
さて、この動画クリッピングの仕組みですが、実現するとなると自動化・システム化も必要になりますよね。自動化を考えた際、少し問題になりそうかと思う点がいくつかありました。これら問題の改善のためMediaLiveの出力先としてAWS Elemental MediaPackageを指定し、またMediaConvertへの入力はMediaPackageでHarvest Jobを行ったVODアセットとする構成を試してみました。
これまでの方法の課題点とHarvest Job活用の着想まで
改めて先日やってみた下記の構成図の方法に対して、課題に思った点をまとめてみます。
自動化を考えた際に気になったのが、MediaConvertへの入力ファイル指定の部分です。MediaLiveの出力としてはArchive outputならびにHLS outputのVOD modeを用いました。
Archive outputの場合、その出力ファイル名はarchive.000000.ts
という形式で、Rollover Intervalごとに000000
の部分がインクリメントされていきます。動作検証ではあらかじめこの出力ファイルの映像を確認、切り出し対象となる映像がarchive.000000.ts
とarchive.000001.ts
にまたがっていることを把握してMediaConvertの2つのInputにそれぞれのファイルを指定しました。
自動化・システム化、またMediaLiveを停止せず長時間稼働している状態から動画クリップを作成する、といったことを考えた際、切り出し対象となる映像がどの(何番目の)アーカイブファイルに含まれているか、ということを把握する必要があります。また切り出す動画の長さ(尺)によってMediaConvertのInputの数も変わりますね。アーカイブファイルの出力開始時間とRollover Intervalから計算して、ということで実現できなくもないかと思いますが、少し複雑になりそうです。よりシンプルに実現する方法がないか検討してみる余地はあるかと考えました。
HLS output VOD modeの場合はどうでしょうか。出力ファイルは起点となるマニフェストファイル(先のブログエントリの例ではhls.m3u8
)に集約されています。Archive outputのようにファイル名が変わったりMediaConvertへの入力ファイル数が変わったりすることはなさそうですね。
MediaLiveの長時間稼働についても考えておきましょう。MediaConvertの入力ファイルに対して、最大時間(尺)や最大容量といった制限があるか、User Guideなどをざっと確認してみましたが、記載は見つけられませんでした。ある程度の長尺動画でも大丈夫なのかなと考えつつ、どこまで受け入れられるのかは注意が必要かと考えます。(無制限に、というわけではないよなと。)なお、MediaConvertの料金としては入力ではなく出力時間に対して課金されるため、クリッピングする前提であれば長尺動画の入力でも料金面の問題はなさそうです。
しかしMediaConvertで入力ファイルのタイムコードを用いてクリッピングすることを考えた場合、入力が24時間を超えたときにどのような挙動になるか、という問題が生じます。タイムコードの指定は HH:MM:SS:FF
ないし HH:MM:SS;FF
で、24時間が上限となる認識です。
またHLS入力の要件をを確認してみると、 入力マニフェストにEXT-X-ENDLIST
またはEXT-X-PLAYLIST-TYPE: VOD
が含まれていること や、ジョブ送信後はマニフェストファイルの変更ができない ということが要件として記載されています。ざっと確認した限りですが、MediaLiveのHLS ouptputのVOD modeではMediaLiveのChannelがRunningの間はセグメントファイルが記載されているマニフェストファイルは常に更新され続け、またEXT-X-ENDLIST
やEXT-X-PLAYLIST-TYPE: VOD
も含まれていませんでした。代わりにEXT-X-PLAYLIST-TYPE:EVENT
が記載さているマニフェストファイルです。
MediaLive ChannelをStopしたあとのHLS outputのマニフェストファイルは更新はなく、またEXT-X-ENDLIST
と#EXT-X-PLAYLIST-TYPE:VOD
が含まれますが、MediaLive Channelの稼働中はそのHLS outputをMediaConvertの入力に使用することは難しそうな気がしています。
ではMediaLiveが稼働中、つまりライブストリーミング中に、マニフェストファイルを更新せずVODの状態でHLSアセットをMediaConvertに入力する方法はないか、と考えると、MediaPackageで利用できるHarvest Jobが思い浮かびました。
ちょうど上記ブログエントリの検証内容にHarvest Jobで作成したマニフェストファイルも記載されているので確認してみると、EXT-X-ENDLIST
やEXT-X-PLAYLIST-TYPE: VOD
という要件はクリアしていそうです。(厳密にはEXT-X-VERSION
の要件の点で上記ブログエントリのマニフェストファイルは相違がありますが、こちらはMediaPackageのContainer typeの変更などで対応します。)
Harvest Jobは Live-to-VOD などとも称されるように、ライブストリーミングで使用したセグメントファイルをそのまま(時間軸のクリッピングなしに)VODにも使用するという仕組みです。(Live-to-VOD の仕組み - AWS Elemental MediaPackage)これ自体で動画の切り出しが可能ではあるのですが、セグメントの間隔が例えば6秒であれば、クリッピングのタイミングと最大で6秒の誤差が生じます。このクリッピングの誤差をより小さくするために、これまでの方法と同様にMediaConvertでタイムコードをもとにしたクリッピングを行います。これは最終的な出力ファイルをHLSアセットではなく、MP4形式の単一ファイルで取得したいという意図もあります。
上記の構成を図にすると以下のようになります。これまでの構成からMediaLiveの出力先はMediaPackageへと変更となりました。またMediaPackageでHarvest Jobを行い、その出力はS3バケットへと保存されます。そのHLSアセットを入力ファイルとしてMediaConvertでタイムコードによるClippingを行います。
なお、このMediaPackage Harvest Job機能の前提条件としてStartover Windowを設定することがあります。このStartover Windowを設定するとタイムシフト再生も可能になりますね。またMediaConvertはS3から入力ファイルを指定するほか、HTTP(HTTPS)で入力ファイルを指定することも可能です。ということは、MediaPackageのタイムシフト再生用URLをMediaConvertの入力にする、といったこともできそうです。
しかし、MediaConvertのHTTP入力の要件を確認してみると、 指定するURLにパラメータを含めることができない 旨が記載されています。MediaPackageのタイムシフト再生では以下のようにURLパラメータの形式で再生する時間を指定します
https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
上記から、タイムシフト再生を直接入力することは不可、Harvest Jobを一度経由して実施としました。
Harvest JobしたVODアセットからタイムコードを基準にクリッピングをしてみた
これまでの方法の課題点とその解決策が確認できたところで、実際にこのHarvest Jobで作成したVODアセットからタイムコードを基準にクリッピングをする方法を試してみたいと思います。
まずはMediaPackageのリソースを作成します。MediaPackage v2を用いてHarvest Jobができるように出力先S3バケットも含めて設定します。
続いて、このMediaPackageの入力となるMediaLiveリソースを作成します。出力をMediaPackage v2(CMAF Ingest)として設定しつつ、出力にタイムコードメタデータを含めるよう設定します。動作確認のためのタイムコードの焼き付けも設定します。
これらリソースが作成できたら、OBS Studioで映像を打ち上げます。MediaPackageによるタイムシフト再生で切り出し位置を確認しつつ、Harvest Jobを行いVODアセットを作成します。そしてさらに、MediaConvertでタイムコードを基準にクリッピングを行い、時刻になるべく正確な動画の切り出しを行います。
今回の構成では、これらが映像の打ち上げ中(ライブストリーミング中)に行えることも特徴です。
MediaPackageリソースの作成
それではMediaPackage v2のリソース作成から進めていきます。Harvest Jobを行う設定となるため、以下ブログエントリ参照しながら進めていきます。
Channel gropuについては以下エントリで作成したものを使用しました。設定の詳細は割愛しますが、Channel group nameとDescriptionのみ設定したものです。(必要に応じてアクセスログを有効にしておきましょう。)
Channelリソースから今回の検証用に作成していきます。Channel gropuの詳細画面から (Create channel) ボタンで進みます。Nameと必要に応じてDescriptionを入力します。Input typeはCMAFとしました。これはMediaLiveでMediaPackage v2 endpointを使用するためです。CMAF Ingestの各種設定は無効、Cahnnel policyもアタッチせずに (Create) ボタンを押下してChannelリソースを作成します。
Channel作成後、遷移した詳細ページのOrigin endpointsのタブから (Create endpoint) ボタンを押下しEndpoint作成ページに進みます。EndpointのNameと必要に応じてDescriptionを入力、Container typeはTSとしました。またAdditional settingsの項目を展開して、Startover windowの項目を変更します。このStartover windowで指定した時間分だけ、過去にさかのぼってのタイムシフト再生ならびにHarvest Jobが可能になりますね。単位は秒(sec.)でデフォルトは900秒 = 5分ですが、今回は172800秒 = 2日間と設定しました。Segment settingsとEncryptionの項目はデフォルトのまま進めます。
Endpoint policyの項目では Attach a public policy
を選択しました。 "Sid": "AllowPublicGetObjectAccess"
のほか、Harvest Jobに必要な "Sid": "AllowMediaPackageHarvestObjectAccess"
が含まれていることを確認しておきましょう。(MediaPackage v2でHarvest JobをするためOrigin endpointに対する権限はこちらのブログエントリをご確認ください。MediaPackage L2V Harvesterの権限が必要となりますね。)
なお、今回はMediaPackageのOrigin endpointを用いて動画視聴を行い、Harvest Jobするタイミングを確認しています。上記設定ではこのOrigin endpointはパブリックアクセス可能な状況となりますが、アクセス制限が必要な場合はこのEndpoint policyでEndpointの保護を行いましょう。
Manifest definitionsの項目では、HLS manifestを追加します。 (Add HLS manifest)ボタンを押下、Manifest nameとChild manifest nameを適切に設定しておきます。その他の項目はデフォルトで進めました。ページ最下部の (Create) ボタンを押下してEndpointを作成します。
以上でMediaPackageのリソース自体は作成完了です。Harvest Jobは後ほど切り出し時間を確認しながら行いますが、Harvest Jobの出力先となるS3バケットの権限について、あらかじめ確認ならびに設定を行っておきましょう。
こちらもMediaPackage v2でHarvest Jobs自体を検証したブログエントリを参考に設定を行います。Harvest Jobの出力先S3バケットに対して、 "Service": "mediapackagev2.amazonaws.com"
からのPutObject権限が必要です。権限付与対象のAWSアカウントも考慮して、以下のポリシーを対象のS3バケットに追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid" : "AllowMediaPackageHarvestJobPutObject",
"Effect": "Allow",
"Principal": {
"Service": "mediapackagev2.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::content-source-xxxxxxxx/*",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "123456789012"
}
}
}
]
}
今回、Harvest Jobsの出力先となるS3バケットについてはPublicReadの権限も付与しているます。最終的なBucket policyは以下のようになりました。
MediaLiveリソースの作成
MediaPackageリソースとHarvest Job出力先となるS3バケットの権限の確認ならびに設定が完了しました。続いてMediaLiveリソースの作成を行います。
InputはRTMP (push)のシングル構成で作成しました。(こちらの詳細は割愛します。)続いて、このInputをアタッチしたChannelリソースの作成です。Channelはシングルパイプラインで、かつMediaPackage v2との連携用にCMAF Ingest Output groupで作成します。
今回、Channel templateとして以下のCustom templateを使用しました。MediaLiveがMediaPackage v2 endpointをサポートした際に検証したブログエントリで作成したものです。GitHub Gistにて公開しています。
medialive-cmaf-ingest-mediapackage-output-channel-template.json
[Create channel] ボタンからChannel作成画面に進み、まずはChannel templateでこのcustom templateをインポートします。
Channel nameやIAM roleを適切に設定、Channel classは SINGLE_PIPELINE
を選択します。
続いてGeneral settingsの項目、Timecode ConfigurationでSourceをデフォルトの EMBEDDED
から SYSTEMCLOCK
に変更します。これで、今回のようにStreaming Software (OBS Studio)側でタイムコードが挿入されていない状況でも、MediaLive側のシステムクロックでタイムコードが挿入されます。
Input attachmentsでは作成済みのInputを設定しました。続いてOutput groupsの項目です。cmaf-ingest-mediapackage-output
というMediaPackage向けOutput groupがCustom templateにより設定されていますね。まずは出力先となるMediaPackageのChannel groupならびにChannelを設定します。
続いてMediaPackage outputsの項目です。video_1080p30
、 video_720p30
、 audio_aac
と3つのOutputがありますが、このうち video_1080p30
については今回削除してしまいました。動作検証は720pの動画で行います。
video_720p30
の設定ページに進みます。このCustom templateではフレームレートが29.97fps(Framerate Numeratorが 30000
、Framerate Denominatorが 1001
)となっている点に留意しておきましょう。(前回の検証では30fpsでしたが、今回は29.97fpsで検証してみます。)
Stream settingsのTimecodeの項目で、Timecode Insertionでデフォルトの DISABLED
から PIC_TIMING_SEI
に変更します。またTimecode Burn-in Settingsを Timecode burnin
に設定、Font Sizeは LARGE_48
、 Positionを BOTTOM_CENTER
に設定しました。
以上でMediaLiveのChannelの設定は完了です。 [Create channel] ボタンを押下してChannelを作成します。
OBS Studioの設定と映像の打ち上げ
MediaPackageならびにMediaLiveのリソース作成が完了しました。続いてOBS Studioの設定を行い、映像をMediaLiveに打ち上げていきます。
OBS Studioの設定については、基本的に前回の検証の際と変わりません。ソースとしてメディアソースを作成、ローカルに保存してあるBig Buck Bunnyの動画ファイルをループ再生します。また確認用として左上に現在時刻を表示させます。こちらのログエントリと同様の設定で、小数点以下1桁までミリ秒表示となります。(フレーム番号ではありません。)
なお、MediaLiveリソースの作成の際にも述べましたが、今回は29.97fps、ドロップフレームで動作検証を行うこととしました。OBS Studio側でも、映像の設定でFPSを 29.97
に設定しておきます。
また配信の設定では、MediaLiveのRTMP (push) InputのEndponit情報を設定します。
MediaLiveのChannelをStartさせてRunning状態になったら、OBS Studioで [配信開
始] ボタンを押下、映像の打ち上げを開始します。
MediaPackage経由で映像の確認
MediaLiveのマネジメントコンソールで入力映像のサムネイル画像を確認しつつ、MediaPackage側で映像を確認します。
MediaPackageのEndpoint詳細ページ、Manifest settingsのタブからURLを確認しつつ、 (Preview) ボタンを押下してhls.js demoのプレビューページを開きましょう。
問題なく視聴できていることを確認しつつ、今回は実際にHarvest JobならびにMediaConvertのクリッピングを行う箇所をこのプレビューページで確認していきます。MediaPackageでStartover Windowを長めに設定してタイムシフト再生も可能にしてるので、この切り出し位置の確認にタイムシフト再生を利用することもできますね。MediaPackageのマネジメントコンソールから開いたhls.js demoのページには以下の形式のHLS manifest indexのURLが指定されています。
https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/stream-clipping-with-harvestjob-empv2-channel/harvestjob-endpoint/index.m3u8
このURLの末尾に ?start=2025-08-30T11:05:00Z
というようにstartパラメータのみを指定してタイムシフト再生することもできます。全体のURLは以下のようになりますね。
https://xxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/stream-clipping-with-harvestjob-empv2-channel/harvestjob-endpoint/index.m3u8?start=2025-08-30T11:05:00Z?start=2025-08-30T11:00:00Z
タイムシフト再生の詳細については以下ブログエントリなどをご参照ください。
MediaPackageでHarvest Jobを実施
MediaPackage経由で映像の確認ができました。ここから実際にHarvest JobでVODアセットの作成、そして最終的なMediaConvertによるタイムコードを用いた動画のクリッピングを行います。
動画クリップの開始点、終了点はMediaPackageでの映像を確認しながら、次の時点としました。
まずクリップの開始点は以下の箇所、タイムコードの 11:09:42;08
です。
終了点は以下、タイムコードの 11:13:20;25
です。
このタイムコードの箇所が含まれるように、まずはMediaPackageでHarvest Jobを行います。Harvest Jobの開始時間はJST時刻で 2025/08/30 20:09:30
、終了時刻は 2025/08/30 20:13:30
とします。
実際のHarvest Jobを作成します。MediaPackageのChannel詳細ページ、Harvest Jobsのタブに進みます。 (Create harvest job) ボタンを押下して、Harvest job nameと必要に応じてDescriptionを入力します。Channel group nameとChannel nameは指定したものであることを確認しておきましょう。またOrigin endpointt nameとHarvested manifests nameでそれぞれを適切に設定します。(今回であれば作成済みのEndpoint、Manifestは1つのみなので、それぞれを選択するだけとなります。)
続いて、Schedule configurationでHarvest job対象のStart date and timeとEnd date and timeを指定します。マネジメントコンソールからはJSTでの指定ができますね。またDestinationの項目、S3destinationでは"Service": "mediapackagev2.amazonaws.com"
からのPutObject権限を付与したS3バケットを指定、S3 destination pathも適切に設定します。最後に最下部の (Create harvest job) ボタンを押下してHarvest Jobを作成します。
Harvest Job作成後はStatusがIn progressですが、しばらくするとCompletedとなります。(今回は数分で完了しました。)
Competedを確認後、Harvest Job出力先のS3バケットを確認しましょう。index.m3u8ならびに各マニフェスト、セグメントファイルがありますね。この index.m3u8
がVODアセットの起点となります。
今回、このS3バケットはパブリックアクセス可能にし、CORSも必要な許可設定をしています。index.m3u8
のObject URLをhls.js demoページに入力して再生確認を行いました。
Harvest jobで生成したVODアセットの最初の映像は、タイムコードで 11:09:35;27
でした。クリッピング対象の 11:09:42;08
より前であることを確認しておきましょう。また左上のOBS Studio側で付与した時刻情報は 20:09:33.2
を示していました。Harvest jobの開始時刻が 20:09:30
だったので若干の誤差、遅延がありますね。
映像の最後はタイムコードで 11:13:36;02
でした。これもクリッピング対象の 11:13:20;25
がきちんと含まれています。また左上のOBS Studioの時刻は 20:13:33.4
でした。Harvest jobの終了時刻は 20:13:30
を指定していたので、MediaPackageの時刻との差が3秒ほどあった、ということになりますね。
さて、ここでHarvest jobで作成したVODアセットに付与されているタイムコードはMediaLiveで焼き付けたもの、映像の中央下に表示されてるものを確認してきました。念のため、セグメントファイル自体にもタイムコード情報が含まれているか確認してきましょう。
前回の検証同様、MediaInfoのコマンドライン版を利用しました。なお、MediaInfoの出力のAudioの項目は割愛しています。
まずはindex.m3u8
からvarinatプレイリスト variant_video_720p30.m3u8
をたどり、はじめのセグメントファイル segment_video_720p30_292466230.ts
と最後のセグメントファイル segment_video_720p30_292466269.ts
を確認します。
$ curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/stream-clipping-202508/mediapackagev2-harvest-job/stream-clipping-harvestjob-1/index.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3300000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3432000
variant_video_720p30.m3u8
#EXT-X-STREAM-INF:CODECS="mp4a.40.2",AVERAGE-BANDWIDTH=120000,BANDWIDTH=120000
variant_audio_aac.m3u8
$ curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/stream-clipping-202508/mediapackagev2-harvest-job/stream-clipping-harvestjob-1/variant_video_720p30.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:292466230
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXTINF:6.006,
segment_video_720p30_292466230.ts
#EXTINF:6.006,
segment_video_720p30_292466231.ts
#EXTINF:6.006,
segment_video_720p30_292466232.ts
#EXTINF:6.006,
segment_video_720p30_292466233.ts
#EXTINF:6.006,
segment_video_720p30_292466234.ts
#EXTINF:6.006,
segment_video_720p30_292466235.ts
<中略>
#EXTINF:6.006,
segment_video_720p30_292466264.ts
#EXTINF:6.006,
segment_video_720p30_292466265.ts
#EXTINF:6.006,
segment_video_720p30_292466266.ts
#EXTINF:6.006,
segment_video_720p30_292466267.ts
#EXTINF:6.006,
segment_video_720p30_292466268.ts
#EXTINF:6.006,
segment_video_720p30_292466269.ts
#EXT-X-ENDLIST
このはじめと終わりのセグメントファイルに対してMediaInfoコマンドを実行します。Time code of first frame
の項目で埋め込まれているタイムコードが確認できますね。
$ mediainfo segment_video_720p30_292466230.ts
General
ID : 1 (0x1)
Complete name : segment_video_720p30_292466230.ts
Format : MPEG-TS
File size : 1.04 MiB
Duration : 7 s 815 ms
Overall bit rate mode : Variable
Overall bit rate : 1 113 kb/s
Frame rate : 29.970 FPS
Video
ID : 481 (0x1E1)
Menu ID : 1 (0x1)
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L3.1
Format settings : CABAC / 3 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 3 frames
Codec ID : 27
Duration : 6 s 6 ms
Bit rate mode : Variable
Maximum bit rate : 3 000 kb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate : 29.970 (30000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Time code of first frame : 11:09:35;27
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
$ mediainfo segment_video_720p30_292466269.ts
General
ID : 1 (0x1)
Complete name : segment_video_720p30_292466269.ts
Format : MPEG-TS
File size : 1.96 MiB
Duration : 7 s 801 ms
Overall bit rate mode : Variable
Overall bit rate : 2 111 kb/s
Frame rate : 29.970 FPS
Video
ID : 481 (0x1E1)
Menu ID : 1 (0x1)
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L3.1
Format settings : CABAC / 3 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 3 frames
Codec ID : 27
Duration : 6 s 6 ms
Bit rate mode : Variable
Maximum bit rate : 3 000 kb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate : 29.970 (30000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Time code of first frame : 11:13:30;03
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
MediaConvertでタイムコードをもとにクリッピング
Harvest JobでVODアセットの作成、ならびに動画切り出し対象のタイミングが含まれてることがタイムコードの参照で確認できました。
続いて、MediaConvertでタイムコードをもとにクリッピングを行います。この手順はおおよそ前回の検証のHLS出力を利用するパターンと同様ですね。指定するInput file URLがHarvest Jobの出力結果のVODアセットとなります。
MediaConvertのマネジメントコンソール、(Create job) ボタンから進みAWS integrationのSerice role設定を先にすませておきます。Inputsの項目、Input 1のInpout file URLでHarvest Job出力結果のHLSアセットのマニフェストファイル、 index.m3u8
を指定します。またInput correctionのチェックボックスをONにして有効化、その中のTimecode sourceをデフォルトの Start at 0
から Embedded
に変更しておきます。
画面を下にスクロールしてInput clipsの項目、 (Add input clip) ボタンを押下してInput clip 1を追加します。Start timecodeを 11:09:42;08
、End timecodeを 11:13:20;25
と指定しました。
Output groupsではFile groupを選択、Destinationを設定します。
Output settingsでExtensionをmp4に設定、Encoding settingsのVideoのMax bitrate (bits/s)を 2500000
(2.5Mbps)と設定しました。そのほかの項目はデフォルトとします。
これで (Create Job) します。MediaConvertの変換が完了したらS3に出力されているMP4ファイルをダウンロードして確認してみましょう。指定したタイムコードでの動画のクリッピングができていますね。
まとめ
ライブストリーミングから時刻に対してなるべく正確に動画切り出しをするための、MediaLiveでタイムコードを埋め込みそのタイムコードを基準にMediaConvertでクリッピングを行う構成について、自動化を考慮した際の懸念点とその解決策を確認してみました。
これまで考えていたMediaLiveのArchive outputやHLS output VOD modeの出力をMediaConvertの入力に使用する構成の場合、入力ファイルの数やその名称、また長時間稼働に対して課題が考えられます。その解決策としてMediaPackageのHarvest Jobを利用、作成したVODアセットをMediaConvertへの入力とする構成を試してみました。
タイムコードを基準にMediaConvertでクリッピングを行い時刻に対して正確な動画切り出しを行うことは、このMediaPackage Harvest Jobを用いた構成でも問題なく動作しましたね。Harvest Jobを使う1ステップが処理に追加はされましたが、ファイル名などを基準とするのではなく、日付時刻を基準にMediaConvertへの入力が用意できます。これまでの構成で懸念として考えていたことはクリアできました。
これまでの検証は動作確認ということもあって、映像ソースのタイムコードを焼き付け、そのタイムコードを基準に動画のクリッピングを行ってきました。このタイムコードはMediaLiveで付与したものを基準としており、映像の送信元となるOBS Studioの時刻と数秒のズレがあります。実際にはこの部分をどう処理するかも検討課題ですね。もちろん、MediaLiveに打ち上げる前の段階でタイムコードを埋め込めればより正確に切り出しができるかと考えます。
また今回あまり深くは触れませんでしたが、MediaPackageでのタイムシフト再生やHarvest Job実行時の時刻の扱いも興味深いところです。セグメントの秒数区切りとなるという制限はありますが、このセグメントを例えば6秒から2秒などへと小さくしたり、またセグメント秒数ぶんのズレがあらかじめ許容できる切り出しであるのであれば、シンプルにMediaPackageのHarvest Jobのみで動画クリップを作成するという方法も取れるかと思います。なおMediaPackageの時刻まわりの扱いとしてはUser Guideからprogram date time (PDT)を使用していることはつかめたので、MediaLiveでMediaPackage endpointに対するEXT-X-PROGRAM-DATE-TIMEタグの扱いなども別途確認できればと考えています。