ffprobe(ffmpeg)でmkvファイルの一部のパラメータを抜き出したいとき

ytmk.hatenablog.jp

こちらの記事で(特に書いていないけど)mp4を念頭に置いた記事を書いた。

が、mkvではうまくいかなかった。

 

その場合は以下のようにオプションを変更する。

```

ffprove -v error -select_streams b -show_entries format=bit_rate -of vsb=p=0 ファイル名

```

 

それはさておき最近姿勢が悪く体調に影響が出ている模様。

良い椅子を買うべきか…

Amazon Linux 2023にはopenssl 1.1.1tはインストールできない

#tl;dr Amazon Linux 2023にてopensslのソースビルドを試したところ「対応してない」ということでビルドすらできなかった。

 This system (linux-x86_64) is not supported. See file INSTALL for details.

epel-releaseが利用可能なら多分導入できる(Amazon Linux 2023はepelが使えない)

そもそも今更1.1.1使う?っていう話

世の中悲しいかな未だに古いphp(5系、7系、8.までが1系1)やらpython3.7とか使っていたりすると3系が使えなかったりする。 そもそも1.1.1は未だにメンテナンスされていて2,3、まだ現役といえば現役。

Amazon Linux 2では1.0系だったため、初期で導入されているpythonは3.7だった。 また、phpもopenssl>=0.98で大体のものが動いていたのでそれまでは問題なかった。

もし、AWS上でシステムが更新できない場合はAmazon Linux 2023は使わずAmazon Linux 2で動かすのが良さそう。 OSは2025年5月まで4はサポートしてもらえる。

phpのサポート?知りませんね


  1. PHP: 要件 - Manual
  2. といっても2023/04/06現在、あと半年は切っているので今から新しく始めるのであれば3系を入れない理由はあんまりない
  3. https://www.openssl.org/policies/releasestrat.html
  4. https://aws.amazon.com/jp/amazon-linux-2/faqs/

ffprobe(ffmpeg)で一部のパラメータを抜き出したいとき

TL;DR

ffprobe -v error -select_streams v -show_entries stream=bit_rate -of csv=p=0 input_file ほしい部分をstream=bit_rateのように指定する。 pythonでは結果に改行コードが含まれるときと含まれないときがあったので、その処理をしてあげるとエラーが減る。 (詳細未確認)

やりたいこと

ffmpegなどで動画のエンコードなどをしたいときに、もとのファイルの横サイズだけがほしい時がある。 特にpythonなどで一括処理したいときには非常に重宝するが、ffprobeをそのまま利用するとプログラムから利用するには難しい。

ffprobe input.mp4

ffprobe version 2022-12-29-git-d39b34123d-full_build-www.gyan.dev Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 43.100 / 57. 43.100
  libavcodec     59. 55.103 / 59. 55.103
  libavformat    59. 34.102 / 59. 34.102
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 53.100 /  8. 53.100
  libswscale      6.  8.112 /  6.  8.112
  libswresample   4.  9.100 /  4.  9.100
  libpostproc    56.  7.100 / 56.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':       
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    creation_time   : 2022-08-30T00:00:0.0000000Z
    encoder         : Blackmagic Design DaVinci Resolve
  Duration: 00:15:06.62, start: 0.000000, bitrate: 7293 kb/s
  Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/bt709/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 6968 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
    Metadata:
      creation_time   : 2022-08-30T00:00:00.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      timecode        : 01:00:00;00
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 320 kb/s (default)
    Metadata:
      creation_time   : 2022-08-30T00:00:00.000000Z
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](eng): Data: none (tmcd / 0x64636D74)
    Metadata:
      creation_time   : 2022-08-30T00:00:00.000000Z
      handler_name    : TimeCodeHandler
      timecode        : 01:00:00;00
Unsupported codec with id 0 for input stream 2

ビデオストリームの情報だけにする

ffprobe.exe -v error -select_streams v -show_entries stream input.mp4 でビデオの情報だけを抜き出せる

ffprobe.exe -v error -select_streams v -show_entries stream input.mp4

[STREAM]
index=0
codec_name=hevc
codec_long_name=H.265 / HEVC (High Efficiency Video Coding)
profile=Main
codec_type=video
codec_tag_string=hvc1
codec_tag=0x31637668
width=1920
height=1080
coded_width=1920
coded_height=1080
closed_captions=0
film_grain=0
has_b_frames=2
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=153
color_range=tv
color_space=bt709
color_transfer=unknown
color_primaries=bt709
chroma_location=left
field_order=progressive
refs=1
id=0x1
r_frame_rate=30000/1001
avg_frame_rate=30000/1001
time_base=1/30000
start_pts=0
start_time=0.000000
duration_ts=27197170
duration=906.572333
bit_rate=6000000
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=27170
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=106
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:creation_time=2022-08-30T00:00:00.000000Z
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
TAG:timecode=01:00:00;00
[/STREAM]

stream情報の一部を抜き出す

上だけでも十分見やすくなったが、この中の一部だけを抜き出したい。 例えばビットレートを抜き出すのであれば、

ffprobe.exe -v error -select_streams v -show_entries stream=bit_rate  input.mp4

[STREAM]
bit_rate=600000
[/STREAM]

となる。 当然bit_rateのように-show_entries streamで表示される表記でないといけない。bitrateとやっても何も出てこないので注意。

プログラムで参照しやすくする

上記の抜き出しでも情報は得られるが、プログラムから呼び出す際はサブプロセスのresultを取得する際は最低限の情報にしたいので、以下のようにオプションを増やす。

ffprobe.exe -v error -select_streams v -show_entries stream=bit_rate -of csv=p=0 input.mp4

600000

これで使いやすくなった。

プログラムでの利用として注意したいのは、時折出力結果に改行コードが含まれることである(Python利用時に発見、その多々詳細不明)。 再現性はあるけどもよくわかっていないので、利用時には出力結果を直接intなどに変換するのではなく改行コードを取り除いてから変換すると良い。

varnishのresolves to too many addressesを解決する

TLDR

varnishの仕様

varnishでは基本的にバックエンドとの対応付けは1対1が基本であり、複数IPなどには対応することができない。 (注:ドメインなどを記載した場合はコンパイル(起動)時にDNSを引いた際のIPアドレスを利用しているっぽい) つまりbackendに"s3-ap-northeast-1.amazonaws.com"のような複数のAレコードを持つようなものを指定しようとすると、resolves to too many addressesと怒られる1

varnishのドキュメントやggってみるとgotoというライブラリが出てくるが、これはシェアウェアのバンドルなので利用できない。

調べてみるとgotoとは別にlibvmod-dynamicというモジュールがあったのでこちらを利用する。 libvmod-dynamicはバックエンドに接続する際にDNSを引くという動作をする。つまりDNSレコードが変わるような環境でも利用できる。 また、複数のレコードがある場合にも問題なく利用できる。

環境

OS: Amazon Linux 2

varnish: 6.0.10(yumからインストール)

構成としてはALBでSSL終端しVarnishが受けて各種バックエンドやS3などに振り分けるといったもの(画像書くのが面倒だった)。 varnishはリバースプロキシとして利用しており読み替えでs3を呼び出す。 s3は静的ファイルが主においてありcssなどを要求する際に利用される。

s3のDNSのAレコードは8つあり、しかもおよそ5秒ごとに変更されるためTTLを長めにしてしまうとアクセスできなくなるので注意(2022/10/28現在)。

構築

  1. 必要なライブラリを追加する sudo yum install getdns-devel varnish-libs-devel
  2. リポジトリにアクセスし、varnishのバージョンと同じブランチを選択する。今回は6.0。
  3. CodeをクリックしDownload ZIPのリンクをコピー
  4. wget する。今回はwget https://github.com/nigoroll/libvmod-dynamic/archive/refs/heads/6.0.zip
  5. unzip unzip 6.0.zip
  6. ディレクトリに入りmake&install
./autogen.sh
./confugure
make
  1. 問題なくmakeできたらsudo make install
  2. 完了を確認したらvclの設定へ

varnish vmod-dynamicの使い方

基本的にはsrc/vmod_dynamic.vccに書いてあるのでそれを見て設定する。 今回は以下のように設定した。

s3.vcl

import dynamic;

probe www_probe {
    .window = 5;
    .initial = 7;
    .threshold = 3;
    .interval = 5s;
}

acl www_acl {
    "0.0.0.0/0";
}

sub vcl_init {
    new s3 = dynamic.director(
        port = "80",
        probe = www_probe,
        whitelist = www_acl,
        ttl = 1s);
}

default.vcl

set req.backend_hint = s3.backend("s3-ap-northeast-1.amazonaws.com");

ここで重要なのは、whitelistの設定である。

vmod_dynamic.vccには「ACLに一致する名前解決結果のみが使用される」と記載があるので、これを記載しないと動作しないようである。 今回はAWSがAWSIPからランダムに(実際はラウンドロビンか何か)IPを変更しているため設定値を0.0.0.0/0としている2が、利用IPの範囲が決まっていれば192.168.0.0/31のように範囲指定すべきである。 設定例では"192.168"/24;となっているのだがこの場合は"192.168.0.0/24"となるんだろうか…?この書き方なら/16が適切な気がするんだけども。

また、TTLは基本的にはDNSの設定値と同様か少し小さい値を設定しておけば良い。 今回はAWSの設定に振り回されないように1secにしてあるが、普通は5mでも1hでもいいと思う。

反映

sudo systemctl restart varnishで反映させる 再起動してもいいかも。

気になること

  • ドキュメント記載の"192.168"/24;を設定したときの許可範囲
  • www_probeの各パラメータの適切さがそもそもわかっていない
    • varnishのドキュメントとlibvmod-dynamicのドキュメントではinitialの定義が違うんだけどlibvmod-dynamicが間違ってる?

varnishわからないことだらけなので誰か教えて下さい。。。


  1. ちなみに2022/10/20辺りではこのようなエラーが出なかったのだが、varnishがアップデートしたのかAWSDNSが変わったのか原因はわからなかった
  2. ドキュメントには0.0.0.0/0にするとIPv4に限定できると書いてある

今からやるWindows10への無料アップデート

Windows7のサポート終了である2020年1月14日が近づいていますね.

ですが,様々な理由からWindows7のままという方も多いのではないでしょうか.

 

Windows10では(というか8から)UIが大幅に変更されたこともあって,私は無料アップグレードを躊躇してしまいました.

そうはいってもサポートが切れたWindowsを使用し続けることほど危険なことはありませんし,古いものにしがみついてるのも良くないのでアップグレードしましょう.

詳細は以下のリンクで確認してください.

 

www.microsoft.com

internet.watch.impress.co.jp

 

 

早速やろう,と言う前に.

Windows7からWindows10に移行するにあたって一つ注意することがあります.

Windows10では「デジタルライセンス」によってハードウェア構成と認証情報が紐づく方式となりました.

(現在はMicrosoftアカウントと紐付いているはず)

 

OS更新の機会にハードの更新も行うと良いかもしれません.

(特にメモリ4GB以下なら8GB[お金があるなら最低16GB!!!!]以上にHDDなら256GB以上のSSDに換装すると幸せになるかも)

 

じゃあやる

準備するもの

・PCのバックアップ

・認証済みのWindows7,Windows8.1PC

・ネットワーク環境

 

やり方

※アップデート時にデータが消える恐れがありますので,必要であればバックアップしてください.

データが消えたなどの責任は取りかねます.

 

1. Windows7/8.1PCから以下のURLにアクセス

www.microsoft.com

 

2. 「ツールをダウンロード」から'MediaCreationTool.exe'をダウンロードし,実行.

3. 「実行する動作の選択」で「今すぐこのPCをアップデート」を選択する.

 

あとは全部アップデータがやってくれます.

 

 これだけなんでやってみてくださいね.というかタダでできて,WindowsUpdateもやってくれるんだからやっておねがいだからみんなやって.

 

 

失敗談

だいぶ短いので私がちょっと変わった環境で似たようなことをやろうとして失敗したことを書いていきます.

これやろうとしてもうまくいきませんのであしからず.

 

失敗したやつ

MacBook Pro (15-inch, 2018)

Windows7 Upgrade用ディスク

・BootCamp環境

 

試したこと

1. とりあえず普通にBootCamp環境へWindows7をインストール

2. Windows7レジストリをいじる

3. Windows10のインストーラをDLしUSBメモリを作成

4. BootCamp環境のWindows7から作成したUSBメモリでUpdateを試す

 

結果的にできませんでした.

USBメモリを検証するところで弾かれた記憶.

ちゃんと確認はとっていませんが,どうもAppleが提供しているBootCamp用のドライバが読み込まれる前にUSBメモリにからのアップデートを試してるのかな?

 

USBメモリの作成やらディスク分割なんかを何度も試したけど,時間がかかって結局失敗する悪い例.

USBを勉強する(1.1~1.2)

いろいろあってUSBを学びたいと思います. とりあえず,下の本を参考に.

忘れっぽいので,少しずつまとめていこうと思います.

USB規格の特徴

  1. 汎用的
  2. 簡単
  3. 低コスト
  4. 接続後にすぐ実行(プラグ・アンド・プレイ機能:PnP)
  5. 電源を入れたまま接続可能(ホット・プラグ機能)
  6. バイスに電源を共有できる
USB1.0
  • 1.5MbpsのLow Speed(LS)モードと12MbpsのFull Speed(FS)モードをサポート
USB2.0
  • 480MbpsのHigh Speed(HS)モードをサポート
USB3.0
  • 5GbpsのSuper Speed(SS)モードをサポート
  • USB2.0と完全上位互換
  • バス・プロトコルのオーバヘッド減少による実効転送速度の向上
  • パワー・マネジメントを強化

USB3.0の策定にはデータサイズや補助記憶装置の容量が大きくなったのが主な理由のようだ.

USB2.0の仕様書はUniversal Serial Bus Specification, Revision 2.0だが, USB3.0の仕様書はUniversal Serial Bus 3.0 Specification, Revision 1.0 とのこと.

結局完全上位互換ならRevision3.0でも良かったのでは?

USB2.0と3.0で共通のアーキテクチャ

  • ハブは最大5個までカスケード接続が可能
  • 1つのUSBホスト(PCとか)に対して最大127デバイスまで接続可能
  • USBデバイスにはデバイス・アドレス(初期値0,初期化後は一意の値)が割り当てられる
USB通信モデル

基本単位としてエンドポイント,パイプ,トランスファで成り立つ.

エンドポイント

エンドポイント番号,転送方向,転送タイプからなる

  • エンドポイント番号: 開発者によって1~15の値が割り振られる
    • エンドポイント番号0はデフォルトエンドポイント(後述)で予約済み
  • 転送方向
    • INエンドポイント: エンドポイントからファンクション・ドライバへの読み込み
    • OUTエンドポイント: ファンクションドライバ・からエンドポイントへデータを書き込み
    • 双方向エンドポイント: どちらも可能.通常はデフォルト・エンドポイントのみ
  • 転送タイプ
    • コントロール・エンドポイント: (基本的に)デフォルト・エンドポイント専用
    • バルク・エンドポイント: 大量のデータをエラーなく伝送する
    • インタラプト・エンドポイント: 一定時間内に少量の転送をエラーなく行う
    • アイソクロナス・エンドポイント: 一定時間内に必ずアクセスされ大量のデータ転送が可能だが,エラーの可能性がある.リアルタイム伝送などを想定

基本的なUSBメモリはコントロール・エンドポイントとバルク・エンドポイントなのかな? いろんな機能を入れようとするとそれ単体ではなさそう.

インタラプトはキーボードとかで使いそう.

とりあえずここまで.

Prime Student(Amazon Student)の資格を更新する

概要

・Prime Student(旧Amazon Student)の資格期限は4年

・学生である証明をして再審査してもらえばいい

 

 

小話

前回の記事から早一年.

 

結局,”週に一本”どころか”年に一本”になっている.

今年は何本になることやら.

 

そもそも論文書かないと卒業できませんので,それが終わったら頑張っていきたい.

(そんなこと言ってるから年一になる…)

 

 

本題

 

Prime Student(旧Amazon Student)はとても便利なもので,買い物・動画・音楽・AWS等とにかく使い勝手が良いわけですが,この度私は資格を失いかけました.

 

別に学生じゃなくなったとか,そういうわけではなく,Prime Studentに”登録してから4年経った”だけなんです.

 

規約にから抜粋

お客様がPrime Student 会員登録をキャンセル又はAmazon.co.jp のアカウントサービスを通して、Amazonプライムの有料会員登録をしない設定に変更されない限り、最初の6か月の無料体験期間終了後、自動的に Prime Student のヘルプページに記載された年会費の有料会員となり、最長で4年半(無料体験期間を含む)Prime Student 会員プログラムをご利用できます(1年毎の自動更新)

 

ああ,もうそんな時期なのか

と言うかそんなに学生やってるのか.

 

そもそも,切れる3ヶ月前にこんなメールが来ます.

 

Prime Studentをご利用いただき、ありがとうございます。このままですと、お客様のPrime Student会員資格は2018/01/05に終了してしまいます。学生証明書を提出いただくだけで、もう1年プライムの半額の年会費でプライム特典をお楽しみいただけます。こちらのリンクから2018/03/06までに会員資格の延長手続きを行ってください。 

 

このメールに気が付かなかったわけですね.

 

Amzaonから通常のプライム料金3900円を請求されてから気が付きました.

 

 

 

解決法

Amazon.co.jp ヘルプ: Prime Student会員資格を延長する

ここにアクセスしてリンク先から学生証などのスキャン(写真)を添付してください.

 

今審査中ですが,まだ学生なので審査は通るはず.

 

よくみたら卒業後も残っている期間はPrime Studentの資格のままみたいですね.

まあ,(卒業できれば)4月から移籍するのですが….

 

もう7年も学生なんですね(震え)