tsファイルをwebmファイルに変換するシェルスクリプト

2021-05-16

Bodhi Linux

t f B! P L

GoogleフォトやAmazonフォトはtsファイルは受け付けない

 Googleフォトではtsファイルのアップロードを拒否されました。

 Amazonフォトではアップロードはできましたが、再生ができませんでした。

ということでこれらにアップロードするにはtsファイルを変換しないといけません。

 ffmpegでtsファイルを変換する

Encoding video for the web · GitHub

このページがとても参考になりました。

H.264のmp4へ変換

 ffmpeg -i soruce.ts -vcodec h264 -acodec aac -strict -2 output.mp4

 VP8のWebMへ変換

 ffmpeg -i soruce.ts -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis output.webm

 VP9のWebMへ変換

  ffmpeg -i soruce.ts -vcodec libvpx-vp9 -b:v 1M -acodec libvorbis output.webm

 VP9の最画質のWebMへの変換

 ffmpeg -i soruce.ts -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 1 -speed 4 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 -g 9999 -aq-mode 0 -an -f webm /dev/null

 

 これでまずffmpeg2pass-0.logファイルが出力されます。

 

 ffmpeg -i soruce.ts -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 1 -speed 0 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 -g 9999 -aq-mode 0 -c:a libopus -b:a 64k -f webm output.webm

 

これでwebmファイルが出力されます。

変換後のファイルサイズ

 

963.5KiBのsource.tsを変換すると、H.264のmp4は916.9KiBとサイズが少し小さくなりました。

VP8のWebMだとさらに小さくなって889.2KiBになりました。

それに対してVP9のWebMは1.4MBとサイズが大きくなってしまいました。

 VP9の最画質のWebMは1.5MBになりました。

 変換後の動画形式

MediaInfoで動画形式を調べました。

source.ts

h264.mp4

VP8.webm

VP9.webm

VP9best.webm

tsファイルをwebmファイルに変換するシェルスクリプトts2webm.sh

元のファイルと同じフォルダに出力します。

#!/bin/bash
# 対象のファイルがあるディレクトリパス。
DIRNAME=Public/videos
# tsファイルを同名のwebmファイルに変換する。
while read -r F ; do
  ffmpeg -i "${F}" -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis "${F%%.*}.webm" </dev/null
done < <(find "${DIRNAME}" -type f -name "*.ts")

出力先フォルダの指定するバージョン。

#!/bin/bash
# 対象のファイルがあるディレクトリパス。
DIRNAME=Public
# 変換後ファイルの保存ディレクトリパス。
TARGETDIR=Videos
# tsファイルを同名のwebmファイルに変換する。
while read -r F ; do
  ffmpeg -i "${F}" -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis "$TARGETDIR/$(basename $F .ts).webm" </dev/null
done < <(find "${DIRNAME}" -type f -name "*.ts")

日付の古いファイルから変換するバージョン。

#!/bin/bash
# 対象のファイルがあるディレクトリパス。
DIRNAME=Public
# 変換後ファイルの保存ディレクトリパス。
TARGETDIR=Videos
# tsファイルを同名のwebmファイルに変換する。
while read -r -d '' D F ; do
  ffmpeg -i "${F}" -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis "$TARGETDIR/$(basename $F .ts).webm" </dev/null
done < <(find "${DIRNAME}" -type f -name "*.ts" -printf "%T@ %p\0" | sort -nz)

変換後のファイルの存在を確認するバージョン。ファイル名しかチェックしていません。

#!/bin/bash
# 対象のファイルがあるディレクトリパス。
DIRNAME=Public
# 変換後ファイルの保存ディレクトリパス。
TARGETDIR=Videos
# tsファイルを作成日順にソートして同名のwebmファイルに変換する。
while read -r -d '' D F ; do
  # 変換後のファイルが存在しないときのみ変換。
  newF="$TARGETDIR/$(basename $F .ts).webm"
  if [ ! -e "${newF}" ]; then
    ffmpeg -i "${F}" -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis "${newF}" </dev/null
  fi
done < <(find "${DIRNAME}" -type f -name "*.ts" -printf "%T@ %p\0" | sort -nz)

前日に作成されたファイルのみ変換するシェルスクリプトts2webm_yesterday.sh。

#!/bin/bash
# 対象のファイルがあるディレクトリパス。
DIRNAME=Public
# 変換後ファイルの保存ディレクトリパス。
TARGETDIR=Videos
# tsファイルを作成日順にソートして同名のwebmファイルに変換する。
while read -r -d '' D F ; do
  # 変換後のファイルが存在しないときのみ変換。
  newF="$TARGETDIR/$(basename $F .ts).webm"
  if [ ! -e "${newF}" ]; then
    ffmpeg -i "${F}" -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis "${newF}" </dev/null
  fi
done < <(find "${DIRNAME}" -type f -daystart -mtime 1 -name "*.ts" -printf "%T@ %p\0" | sort -nz)

1 1 * * * ~/ts2webm_yesterday.sh 

シェルスクリプトをホームフォルダに置いてcron.confにこれを登録すると毎日午前1時1分に自動実行されます。

参考にしたページ

【シェル芸人への道】Bashの変数展開と真摯に向き合う - Qiita

シェル変数の文字列操作の解説。

 

bash と ffmpeg でハマった話

ループで使うにはffmpeg に </dev/null を足さないと処理されないファイルがでてくる。

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ