web-dev-qa-db-ja.com

デスクトップ用とウェブ用にmp4にテキスト字幕を埋め込む?

Ubuntu 18.04のFirefoxで.MP4ビデオを再生できると思って以来(たとえば、Firefox 43はまだ再生できず、Firefox 60は再生できます)、特にアップロードする必要がある場合は、この概念に非常に満足しています。共有するためのビデオ。 サーバーにMimeタイプを設定する 、Apacheサーバーの.htaccessファイルに次のようにスローする必要があります。

AddType video/mp4 .mp4

...次に、ブラウザでhttp(s):// ... mp4リンクを開くだけで、完了です。

ただし、多くの場合、字幕も追加したいと思います。たとえば、「ハード字幕」のように、ビデオをピクセルとして「焼き付け」たくないので、そのままにしておきたいと思います。個別のテキスト情報。 .mkvコンテナがこれをサポートしていることは知っていますが、Firefoxではサポートされていません( 1422891- [再考] Firefoxでmkv | matroska | video/x-matroskaをサポート )。

だから、私はちょうどコンテナとしての.MP4が実際に別々の字幕を含むことができることを発見しました:

また、 https://en.wikipedia.org/wiki/Comparison_of_video_container_formats MP4「キャプション/字幕」に関する注記:

ttxt、プライベートobjectTypeIndicationを持つVobSubsはsceneDescription(Neroで開始)では使用できません、BIFS

VOBSUBは.bmp/pixel形式なので、興味はありませんが、ttxtは興味深いものです。

ただし、字幕を.MP4ファイルに一度埋め込んでから、字幕ファイルをWeb上で(字幕付きで)表示できるようにしたい(できれば、JavaScriptを使用せずに正しいMIMEタイプを提供するサーバーにアップロードするだけで)。とデスクトッププレーヤー。

これにはどのような手順を使用できますか?また、その例があるので、おおよそ何が期待できるかわかりますか?


https://Apple.stackexchange.com/questions/116927/auto-add-subtitles-into-the-mp4-videos

mp4はttxtとVobSubをサポートしていますが、srtやassはサポートしていません。

https://gpac.wp.imt.fr/mp4box/ttxt-format-documentation/

3GPPコンソーシアムは、SMIL、SVG、BIFSなどのシーンの説明とは関係なく、テキストストリーミングの標準を定義しています。3GPPTimedText ... MPEG-4 Streaming Text

テキストストリームのオーサリングを支援するために、XML形式がGPACで開発されました。これは、timed-textのTTXTと呼ばれます。拡張子はbeing.ttxtです。

tx3gのffmpegサポート

FFmpegコーデックのmov_textとtx3gは同じものです: MPEG-4 Part 17 (時限テキスト)。

1
sdaau

これに関する情報は少し散らばっているので、例を思いつくのは少し難しかったです。もちろん、これを行うためのより良い方法があるかどうか、私はまだ聞きたいです。しかし、これが私がUbuntu 18.04で行ったことです-最初に、一時ディレクトリ:

cd /tmp
mkdir videotest
cd videotest

入力ビデオを取得することから始めましょう-ビッグバックバニーの予告編:

wget http://download.blender.org/Peach/trailer/trailer_480p.mov \
 -O big_buck_bunny_trailer_480p.mov

これは.mov形式ですが、問題ありません。次のように変換できます Web Gistのビデオのエンコード

ffmpeg -i big_buck_bunny_trailer_480p.mov \
 -vcodec libx264 -pix_fmt yuv420p -acodec aac \
 -strict -2 -profile:v baseline -level 3 \
 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
big_buck_bunny_trailer_480p.mp4

-vf ...オプションがないと、ffmpegによって「2で割り切れない幅を取得(853x480)」エラーが発生することに注意してください。

次に、この予告編の字幕を取得しましょう-私はここでそれらを見つけました:

wget https://raw.githubusercontent.com/moust/MediaPlayer/master/demo/subtitles.srt \
 -O big_buck_bunny_trailer_480p.srt

この時点で、すぐにvlc big_buck_bunny_trailer_480p.mp4を試すことができます。これでビデオが再生され、一致するファイル名で.srt字幕が自動的に読み込まれます。

これまで、Ubuntu18.04で次のソフトウェアバージョンを使用しました。

$ vlc --version
VLC media player 3.0.4 Vetinari (revision 3.0.4-0-gf615db6332)
$ ffmpeg -version
ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers

次に、MP4Boxを取得する必要があります。これは次の方法で実行できます。

Sudo apt install gpac

https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/ 現在、最新バージョンのgpac_0.7.2-DEV-rev985があります。しかし、Ubuntu18.04のバージョンは次のとおりです。

$ apt-show-versions -r ^gpac
gpac:AMD64/bionic 0.5.2-426-gc5ad4e4+dfsg5-3 uptodate
$ MP4Box -version
MP4Box - GPAC version 0.5.2-DEV-revVersion: 0.5.2-426-gc5ad4e4+dfsg5-3

これで、最初に.srt.ttxtに変換できます。

MP4Box -ttxt big_buck_bunny_trailer_480p.srt \
 -out big_buck_bunny_trailer_480p.ttxt

...そしてember ..ttxtmp4

MP4Box -add \
 big_buck_bunny_trailer_480p.ttxt:lang=eng":name=English":layout=0x60x0x-1:group=2 \
 big_buck_bunny_trailer_480p.mp4 \
-out subtitled_video.mp4

このsubtitled_video.mp4はVLC3.0.4で字幕を表示しますが、明示的に右クリックして、VLCで字幕/サブトラック/トラック1- [英語]を選択する必要があります。 Firefox 60でsubtitled_video.mp4を開くと、字幕は表示されず、字幕を有効にするためのボタン/コンテキストメニューも表示されません。

この時点で、Firefoxには字幕用のUIがあることに注意してください。

...ただし、WebVTT/wvtt/.vtt形式の字幕の場合はのみのようです。

...そして、only<video>タグを使用したHTML5/JS経由(したがって、ビデオに字幕を埋め込んで直接http *を開くことはできません)ビデオファイルにリンクし、字幕が表示されることを期待します)。さらに、次のように:

... <video>タグを使用しても、現在、ビデオに埋め込まれている字幕はサポートされていません(別の.vtt字幕ファイルが必要です)-mp4を除き、MP4Box.jsJSライブラリによるものです。

このMP4Box.jsライブラリの場合:

また、Gitリポジトリには最近のアクティビティがありますが、 https://github.com/gpac/mp4box.js/releases 個々のファイルを含む最後のアクティビティはv0.3.15(2016年3月16日)です。 、最後の.Zipはv0.3.16(2016年7月12日)です。ソースから完全なJSライブラリを構築するのは少し複雑です(gruntを使用する必要があります)。

また、MP4Box.jsは、字幕だけでなくMP4でのより複雑なタスクを対象としており、デモページは非常に複雑で、そのすべてを示すことを目的としています。そのため、デモページを縮小し、ローカルの.mp4ファイルを開いて再生するだけのHTMLを作成するのに少し時間がかかりました。次のとおりです。

MP4Box.jsライブラリのv0.3.15を使用していることに注意してください(古いデモページから開発されました)。特に、新しいバージョンのライブラリ(および新しいデモページ)のAPIはわずかに異なるため、新しいライブラリで使用すると古いJSコードが破損します。

(このテストページは、ダウンロードの半分で、mp4box.releaseUsedSamplesで、x.samples undefinedメッセージで中断することにも注意してください。ページは、このステートメントをスキップすることでこれを回避しようとします。これにより、Firefox60でダウンロードが約1秒短く完了します-つまり、ほとんどのビデオは再生可能ですが、ループすることはできません)

これを念頭に置いて、test-MP4Box.js-v0.3.15.htmlsubtitled_video.mp4.ttxtサブタイトルが埋め込まれている)と同じディレクトリに配置し、Firefoxで.htmlページを開くと、JavaScriptコンソールに次のように表示されます。

[0:00:00.552] [MSE] MIME type 'video/mp4; codecs="tx3g"' not supported for creation of a SourceBuffer for track id 3    mp4box.all.js:33:6
TypeError: Argument 1 of HTMLMediaElement.addTextTrack '' is not a valid value for enumeration TextTrackKind.     test-MP4Box.js-v0.3.15.html:412:20

したがって、tx3g.mp4/txtt埋め込み字幕はVLC3.0.4で表示できますが、MP4Box.jsではサポートされていません。MP4Box.jsでサポートされている埋め込み字幕はWebVTTのみです。

ありがたいことに、WebVTTとして、MP4Boxを使用して、すでに持っている.srtを埋め込むことができます。

MP4Box -add big_buck_bunny_trailer_480p.srt:fmt=VTT \
 big_buck_bunny_trailer_480p.mp4 
-out subtitled_video.mp4

...そしてFirefox60でtest-MP4Box.js-v0.3.15.htmlを開くと、字幕とCCボタンが表示されます。

ff-mp4box

ただし、VLC 3.0.4でWebVTT字幕が埋め込まれたこのsubtitled_video.mp4を開くと、残念ながら字幕を再現できないことがわかります。

ただし、このコミットでは.mp4でのWebVTTのサポートが追加されています mux:mp4:webvttのサポートを追加・videolan/vlc @ 86f5f48・GitHub 2018年1月22日から。これを取得するには、インストールする必要がありましたsnapとして毎晩最新のVLCを介して:

Sudo snap install --channel=Edge vlc

...それは私に与えました:

$ snap run vlc --version
VLC media player 4.0.0-dev Otto Chriek (revision 4.0.0-dev-5939-gee31d91)

...そしてこのVLC4.0.0は、最終的に、WebVTT字幕が埋め込まれたsubtitled_video.mp4の字幕を再生できます。 (ただし、 https://askubuntu.com/questions/1106832/running-a-snap-installed-side-by-side-parallel-to-a-debian-package の問題に注意してください)

1
sdaau

上記は少し複雑なので、このテストスクリプトで記述された別のアプローチを選択しました(この投稿で同じファイルを使用します。スクリプトはfile://プロトコルを介してローカルでも機能するはずです):

基本的に、これは単なる標準のHTML5ビデオプレーヤーであり、.srtファイルへのhrefを含む字幕トラックがあります。前述のように、HTML5ビデオエンジンはサポートしていません。ただし、ページの読み込み時に、.srtファイル名はサブタイトル<track>src属性を介して読み取られ、ファイルはXHRを介して読み取られてから、 https ://github.com/imshaikot/srt-webvtt これは、.srtからWebVTTをその場で生成し、それを字幕トラックに適用して、機能できるようにします。

したがって、字幕が埋め込まれたビデオをサーバーにダンプするほど簡単ではありませんが、ここで行う必要があるのは、HTML .mp4内に.srt<video>のファイル名を書き込むことだけです。プレーヤーコード。オンザフライで行われるため、変換についてこれ以上心配する必要はありません。

1
sdaau