TSから字幕情報を抽出してFFmpegで動画に埋め込む方法について説明します。TSファイルに字幕情報は含まれていません。理由は、recpt1コマンドのオプションで”–sid”を指定しているため、字幕情報などが省略されているためです。そのため、字幕情報を抽出したい場合、省略されていない生(なま)のTSを録画する必要があります。問題なのは、生TSはマルチ編成の番組(1チャンネルでニュースと野球を放送等)やEPG、ワンセグを全てまとめた1つのファイルに録画してしまうことです。そのため、ファイルサイズが”–sid”オプション指定時よりも大きくなります。マルチ編成の番組の場合、PCでは現状はメインの番組の字幕情報しか抽出できなさそうです。私が調べた限りでは方法が見つかりませんでした。これは、マルチ編成で放送されることがあまり無い地デジではほとんど問題になりませんが、BSやCSで生のTSを録画すると他のチャンネルと一緒に録画されてしまうため注意が必要です。TS”を選択するだけで良いです。Chinachuでは番組個別に録画方法を指定する方法がありません。そのため、Chinachuの環境ではrecpt1コマンドを直接実行して録画するしか方法はないでしょう(多分)。字幕の抽出方法Linuxで生TSから字幕情報を抽出するにはassdumperコマンドを使用します。調べた限り、Linuxで使い勝手の良いコマンドはこれ以外に見つかりませんでした。このコマンドはASS形式の字幕情報を出力します。/usr/local/bin/ass*サーバー用の最小環境しかインストールしていない場合、日本語フォントをインストールする必要があります。コマンドの使用方法は、生TSファイルを引数に指定し、リダイレクトでファイルに出力します。このままだと字幕の時間情報が録画時の時刻のままなので、録画開始時の時刻を0秒としてassadjust.rbスクリプトで相対時刻に直します。それらの手順を実行したものが以下となります。output.assassdumperコマンドを実行しただけのASSファイルの内容は以下になります。下落率はともに6年連続で縮小しました。中東やアフリカからドイツなどを目指す難民や移民。assadjust.rbスクリプトで録画開始時刻を”21:27:17”に指定して実行した結果が以下になります。時刻がずれていることが分かります。下落率はともに6年連続で縮小しました。中東やアフリカからドイツなどを目指す難民や移民。assadjust.rbスクリプトを使うのでも良いのですが、フォント情報が入っていないため、このままではFFmpeg用には使用できません。UNAでは録画ファイル名に録画開始時刻が含まれているため、ファイル名を元に時刻をずらすことが出来れば使い勝手が良さそうです。言う訳で、スクリプトを自作してみました。Default,TakaoPGothic,20,&H00FFFFFF,&H0000FFFF,&H00000000,&H80000000,0,0,0,0,90,90,0,0,1,1,1,2,20,20,20,128ENDclose($ass_handle);ダブルクリックするとスクリプト全体を選択した状態になるのでCtrl+Cでコピーして下さい。/usr/local/bin/ディレクトリなどに”assconv.pl”として保存して下さい(UTF8の改行コードはLF)。/usr/local/bin/assconv.plデフォルトのフォント指定は”TakaoPGothic”としています(スクリプトの132行目)。7の場合、”IPAPGothic”として下さい。他のフォントに変える場合、fc-listコマンドでフォント名を確認して変更します。下記はコマンドの実行例です。日本語名の後ろにASSで指定可能な英語フォント名があります。Takaoゴシック,TakaoGothic:style=Regularassconv.plスクリプトはファイル名の先頭が録画開始時刻(YYYYMMDD_hhmm[ss])の形式に対応しています。この形式のファイル名ならば、ファイル名から取得した録画開始時刻を元にASSファイルの時刻をずらして出力します。UNAの環境で使用する場合、ファイル名の形式を以下とすると利用できます。%YEAR%%MONTH%%DAY%_%HOUR%%MIN%%SEC%_%TYPE%%CH%_%TITLE%録画開始時刻の引数指定や録画開始前のマージン秒を指定することも可能です。詳細は”-h”オプションで表示される内容を確認して下さい。playerでも使用可能なはずなのですが、ASSファイルを読み込むと再生できませんでした(字幕が表示できないのではなく、再生が始まりません)。Windowsで試したので、フォント名をWindowsのものに変更したり、色々と試したのですが駄目でした。少なくともFFmpegでは読み込むことができるので、今のところ良しとしています。FFmpegで字幕を動画に埋め込む方法FFmpegで字幕を動画に埋め込むには、libassに対応したFFmpegが必要です。本ブログではFFmpegのビルド方法を紹介しています。そちらの記事でlibassに対応したFFmpegをビルドする手順を説明しています。詳細は「LinuxでFFmpegをほぼ全自動でビルドする(CentOS、Ubuntu等に対応)」を参照して下さい。下記はFFmpegのASSファイルの指定例です。下記のオプションでASSファイルを指定する。上の画像は実際にFFmpegで作成した動画のスクリーンショットです。Pゴシックで埋め込んだ字幕です。ASSではフォントサイズや位置など細かい指定ができます。詳細は参考ページを確認して下さい。15:28いつもお世話になっております。21:28rhejr_ehd様>ご連絡ありがとうございます。更新に気付いていなかったので助かります。現状忙しいため、早めに書けたら良いなと言う感じです。14:42vlcだと、mpegts再生時には外部の字幕(srt,ass等)使えないってのは既知の不具合だったとお思いマス。(少なくともちょいと前まではそうでしたが、今どうなってるかは分かりません。)ただ、現状のvlcのtrunkでは一応ネイティブに日本のデジタル放送(地デジ、BSデジタル)の字幕に対応しておりますので、地デジBSデジタルに関しては、そのまま字幕付きで見ること出来たりします。公式ビルドの状況はどうなってるかについては実は未確認ですが、少なくとも自分でtrunkのソースからビルドした場合は、とくになにもせんでも、字幕機能ありでビルドされますね。現状のソースは日本のデジタル放送かどうか判別する部分が若干微妙なままなので、ストリームに字幕が含まれていても出ない場合もあったりしますが、自分でビルドするときは、強制的にこれは日本のデジタル放送なんだと認識させるようにソース変更してたりします。いえ、mp4にトランスコードしたりする際には、字幕抜いて別途やきつけるってのはいいですね。19:35nkoriyama様>貴重な情報ありがとうございます。見直しが必要だと常々思っていたところです。今後の参考にさせて頂きます。付いている欄は必須項目です。書き込まれた内容は確認後にメールアドレス以外を公開します。本名など身元の分かる情報を書かないようにお願いします。yokiLinux系システムが得意分野の個人SEです。このブログでは主に趣味的な内容を扱っていきます。