Excel VBAで実用ツール(HLS(HTTP Live Streaming)編)

2024-01-07

■HLS(HTTP Live Streaming)の概要

HLS(HTTP Live Streaming)は、Apple社が開発したストリーム配信用の規格で、規格書の冒頭には「インターネットを介して継続的で長い形式のビデオを配信するための、信頼性が高く費用効果の高い手段を提供します」と記載されています。

Wikipediaを見ると、マルチメディア・プレイリストのファイル・フォーマットがM3Uファイルであり、「エンコードがUTF-8であることを明示するとき、拡張子M3U8を使用する」と記載されており、このM3U8ファイルをApple社が拡張して規格化したものがHLSという経緯のようです。

HLSの規格書は、最初の部分で使用可能なメディア・セグメント(「MPEG-2 Transport Streams」「Fragmented MPEG-4」「Packed Audio」「WebVTT」の4つ)を列挙した後、残りの大半の部分を割いて「プレイリスト(M3U8)ファイル」の記述方法を記載しており、下表のタグが定義されています。
⇒詳細はApple社のサイト(HLS(HTTP Live Streaming))を参照して下さい。

(M3U8ファイルのタグ)

4.1.Playlist
4.2.Attribute Lists
4.3.Playlist Tags
4.3.1.Basic Tags
4.3.1.1.EXTM3U
拡張M3Uプレイリスト・ファイルであることを示す
4.3.1.2.EXT-X-VERSION
プレイリスト・ファイルのバージョンを示す
4.3.2.Media Segment Tags
4.3.2.1.EXTINF
メディア・セグメントの期間を指定する
4.3.2.2.EXT-X-BYTERANGE
メディア・セグメントがURIで識別されるリソースのサブ範囲であることを示す
4.3.2.3.EXT-X-DISCONTINUITY
後続のメディア・セグメントとその前のメディア・セグメントの間の不連続性を示す
4.3.2.4.EXT-X-KEY
暗号化されたメディア・セグメントを復号化する方法を指定する
4.3.2.5.EXT-X-MAP
該当するメディア・セグメントを解析するために必要なメディア初期化セクションを取得する方法を指定する
4.3.2.6.EXT-X-PROGRAM-DATE-TIME
メディア・セグメントの最初のサンプルを絶対的な日付や時間に関連付ける
4.3.2.7.EXT-X-DATERANGE
日付範囲(開始日と終了日によって定義される時間の範囲)を一連の属性/値のペアに関連付ける
4.3.3.Media Playlist Tags
4.3.3.1.EXT-X-TARGETDURATION
最大メディア・セグメント期間を指定する
4.3.3.2.EXT-X-MEDIA-SEQUENCE
プレイリスト・ファイルに表示される最初のメディア・セグメントのメディア・シーケンス番号を示す
4.3.3.3.EXT-X-DISCONTINUITY-SEQUENCE
同じバリアント・ストリームの異なるレンディション間、またはメディア・プレイリストにEXT-X-DISCONTINUITYタグを持つ異なるバリアント・ストリーム間の同期を可能にする
4.3.3.4.EXT-X-ENDLIST
メディア・プレイリスト・ファイルにメディア・セグメントが追加されないことを示す
4.3.3.5.EXT-X-PLAYLIST-TYPE
メディア・プレイリスト・ファイルに関する可変情報を提供する
4.3.3.6.EXT-X-I-FRAMES-ONLY
プレイ・リストの各メディア・セグメントが単一のIフレームを記述することを示す
4.3.4.Master Playlist Tags
4.3.4.1.EXT-X-MEDIA
同じコンテンツの代替レンディションを含むメディア・プレイリストを関連付ける
4.3.4.2.EXT-X-STREAM-INF
バリアント・ストリームを指定する
4.3.4.3.EXT-X-I-FRAME-STREAM-INF
マルチメディア・プレゼンテーションのIフレームを含むメディア・プレイリスト・ファイルを識別する
4.3.4.4.EXT-X-SESSION-DATA
任意のセッション・データをマスター・プレイリストに含める
4.3.4.5.EXT-X-SESSION-KEY
メディア・プレイリストの暗号化キーをマスター・プレイリストで指定する
4.3.5.Media or Master Playlist Tags
4.3.5.1.EXT-X-INDEPENDENT-SEGMENTS
メディア・セグメント内の全てのメディア・サンプルが他のセグメントからの情報なしでデコードできることを示す
4.3.5.2.EXT-X-START
プレイリストの再生を開始する優先ポイントを示す

M3U8ファイルのタグは色々ありますが、断片化されたファイルをつなげて1つのストリームとして再生することが主目的ですので、各ファイルのURLが列挙されています。

(M3U8ファイルの例)

  • #EXTM3U
  • #EXT-X-TARGETDURATION:13
  • #EXT-X-ALLOW-CACHE:YES
  • #EXT-X-PLAYLIST-TYPE:VOD
  • #EXT-X-VERSION:3
  • #EXT-X-MEDIA-SEQUENCE:1
  • #EXTINF:10.010,
  • https://aaa.com/bbb/seg-1.ts
  • #EXTINF:10.010,
  • https://aaa.com/bbb/seg-2.ts

■M3U8ファイルに記述されたURLが不完全な場合の補完方法

前掲の例はURLが完全な形で記述されていますが、例えば下図のようにURLの後半部分しか記述されていない場合には、ChromeやFirefoxといったブラウザを使用してURLを調査し、不足部分を補完して完全なURLに修正する(※)必要があります。

(※)この例であれば、メモ帳などのテキスト・エディタでM3U8ファイルを開き、「bbb/」の部分を「https://aaa.com/bbb/」に置換するイメージです。

(URLが不完全なM3U8ファイルの例)

    • #EXTM3U
    • #EXT-X-TARGETDURATION:13
    • #EXT-X-ALLOW-CACHE:YES
    • #EXT-X-PLAYLIST-TYPE:VOD
    • #EXT-X-VERSION:3
    • #EXT-X-MEDIA-SEQUENCE:1
    • #EXTINF:10.010,
    • bbb/seg-1.ts
    • #EXTINF:10.010,
    • bbb/seg-2.ts

Chromeによる調査方法

Chromeの画面上で右クリックしてメニューを表示し、「検証」を選択して左クリックすると、デベロッパー・ツールが起動して検証モードになりますので、

「Network」タブを表示して、動画を再生すると、

「Name」欄にアクセスしているファイルの名前が表示されるので、M3U8ファイルに定義されているtsファイルが表示された行にカーソルを合せて右クリックしてメニューを表示し、

「Copy」-「Copy link address」を選択して左クリックすると、完全なURLがクリップ・ボードにコピーされます。

Firefoxによる調査方法

Firefoxの画面上で右クリックしてメニューを表示し、「調査」を選択して左クリックすると、開発ツールが起動しますので、

「ネットワーク」タブを表示して、動画を再生すると、

「ファイル」欄にアクセスしているファイルの名前が表示されるので、M3U8ファイルに定義されているtsファイルが表示された行にカーソルを合せて右クリックしてメニューを表示し、

「コピー」-「URLをコピー」を選択して左クリックすると、完全なURLがクリップ・ボードにコピーされます。

■M3U8ファイルに記述された動画ファイルを結合するツール

M3U8ファイルに完全なURLが記述されていれば、断片化された動画ファイルをダウンロードし、1つの動画ファイルに結合することができます。

自力で実現するのは困難ですが、ffmpegという有名なフリー・ソフトがあり、コマンド・プロンプトからこのソフトを実行すれば簡単に実現できます。

ffmpegの使用方法

ffmpegの基本的な使用方法は「ffmpeg -i 入力ファイル 出力ファイル」という形式ですが、その前後に多くのオプションを指定する必要があります。

コマンド・プロンプトから「ffmpeg -h」と入力すると、下図のように使用法が表示されますが、見ていただくとわかるように、このヘルプを表示するオプション(「Getting help」)にも多くのバリエーションがあります。

また、ここには表示されていないオプションもありますので、詳細についてはffmpegに同梱されているドキュメント(または、ffmpegの公式サイト)を参照して下さい。

  • Hyper fast Audio and Video encoder
  • usage: ffmpeg [options] [[infile options] -i infile]… {[outfile options] outfile}…
  • Getting help:
  •     -h — print basic options
  •     -h long — print more options
  •     -h full — print all options (including all format and codec specific options, very long)
  •     -h type=name — print all options for the named decoder/encoder/demuxer/muxer/filter/bsf
  •     See man ffmpeg for detailed description of the options.
  • Print help / information / capabilities:
  • -L show license
  • -h topic show help
  • -? topic show help
  • -help topic show help
  • –help topic show help
  • -version show version
  • -buildconf show build configuration
  • -formats show available formats
  • -muxers show available muxers
  • -demuxers show available demuxers
  • -devices show available devices
  • -codecs show available codecs
  • -decoders show available decoders
  • -encoders show available encoders
  • -bsfs show available bit stream filters
  • -protocols show available protocols
  • -filters show available filters
  • -pix_fmts show available pixel formats
  • -layouts show standard channel layouts
  • -sample_fmts show available audio sample formats
  • -colors show available color names
  • -sources device list sources of the input device
  • -sinks device list sinks of the output device
  • -hwaccels show available HW acceleration methods
  • Global options (affect whole program instead of just one file:
  • -loglevel loglevel set logging level
  • -v loglevel set logging level
  • -report generate a report
  • -max_alloc bytes set maximum size of a single allocated block
  • -y overwrite output files
  • -n never overwrite output files
  • -ignore_unknown Ignore unknown stream types
  • -filter_threads number of non-complex filter threads
  • -filter_complex_threads number of threads for -filter_complex
  • -stats print progress report during encoding
  • -max_error_rate maximum error rate ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.
  • -bits_per_raw_sample number set the number of bits per raw sample
  • -vol volume change audio volume (256=normal)
  • Per-file main options:
  • -f fmt force format
  • -c codec codec name
  • -codec codec codec name
  • -pre preset preset name
  • -map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
  • -t duration record or transcode “duration" seconds of audio/video
  • -to time_stop record or transcode stop time
  • -fs limit_size set the limit file size in bytes
  • -ss time_off set the start time offset
  • -sseof time_off set the start time offset relative to EOF
  • -seek_timestamp enable/disable seeking by timestamp with -ss
  • -timestamp time set the recording timestamp ('now’ to set the current time)
  • -metadata string=string add metadata
  • -program title=string:st=number… add program with specified streams
  • -target type specify target file type (“vcd", “svcd", “dvd", “dv" or “dv50" with optional prefixes “pal-“, “ntsc-" or “film-“)
  • -apad audio pad
  • -frames number set the number of frames to output
  • -filter filter_graph set stream filtergraph
  • -filter_script filename read stream filtergraph description from a file
  • -reinit_filter reinit filtergraph on input parameter changes
  • -discard discard
  • -disposition disposition
  • Video options:
  • -vframes number set the number of video frames to output
  • -r rate set frame rate (Hz value, fraction or abbreviation)
  • -s size set frame size (WxH or abbreviation)
  • -aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
  • -bits_per_raw_sample number set the number of bits per raw sample
  • -vn disable video
  • -vcodec codec force video codec ('copy’ to copy stream)
  • -timecode hh:mm:ss[:;.]ff set initial TimeCode value.
  • -pass n select the pass number (1 to 3)
  • -vf filter_graph set video filters
  • -ab bitrate audio bitrate (please use -b:a)
  • -b bitrate video bitrate (please use -b:v)
  • -dn disable data
  • Audio options:
  • -aframes number set the number of audio frames to output
  • -aq quality set audio quality (codec-specific)
  • -ar rate set audio sampling rate (in Hz)
  • -ac channels set number of audio channels
  • -an disable audio
  • -acodec codec force audio codec ('copy’ to copy stream)
  • -vol volume change audio volume (256=normal)
  • -af filter_graph set audio filters
  • Subtitle options:
  • -s size set frame size (WxH or abbreviation)
  • -sn disable subtitle
  • -scodec codec force subtitle codec ('copy’ to copy stream)
  • -stag fourcc/tag force subtitle tag/fourcc
  • -fix_sub_duration fix subtitles duration
  • -canvas_size size set canvas size (WxH or abbreviation)
  • -spre preset set the subtitle options to the indicated preset

ffmpegを実行するExcelツール

前述の通り、ffmpegには大量のオプションを指定する必要があり、コマンド・プロンプトから手入力で実行するのは困難なため、Excel VBAで簡単なツールを作成しました。

行番号7でWshShellオブジェクトをインスタンス化し、行番号8でRunメソッドを使用してffmpegを実行しています(※)。
⇒WshShellオブジェクトの詳細は、Excel VBAで実用ツール(FSO、dirコマンド、WshShellオブジェクト編)を参照して下さい。

(※)行番号8で指定しているオプションの詳細については、ffmpegのドキュメントを参照していただきたいんですが、ざっくり言うとprotocol_whitelistオプションで使用するプロトコルを指定し、movflagsオプションでメタデータを先頭に移動、codecオプションで元データをコピーするように指定しています。

  1. Dim sht As Worksheet
  2. Dim wsh As IWshRuntimeLibrary.WshShell
  3. Dim rc As Long
  4. Private Sub Sample1()
  5.     Set sht = ActiveSheet
  6.     Set wsh = New IWshRuntimeLibrary.WshShell
  7.     rc = wsh.Run(“cmd /k" & “ffmpeg.exe -protocol_whitelist file,http,https,tcp,ts,crypto,tls -i C:\work\xxx.m3u8 -movflags faststart -c copy C:\work\xxx.mp4", 1, True)
  8. End Sub

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

実用ツール

Posted by hides