パソコンの話題が続きますが.

投稿者:arrumis

(追記)こちらの記事はLinux上で行った記事です.powershell上で同じ事を行いたい場合はこちらの記事を参考にどうぞ.

 

一つ前の記事でかいたシェルスクリプトで,ffproveをつかって,ファイル情報をjson形式で受け取り,その内容から解像度を読み出す.という方法をとりましたが,別のアプローチ.というか,たぶんこっちが一般的なんだろうなと言う方法も備忘録(ボウビ録って思ってたよw)として,残しておきます.

使うのは,

  • ffmpeg
  • grep
  • sed(正規表現も)

 

まずは,ffmpegで情報を引っ張ってくる

~$ ffmpeg -i sample.m2t
ffmpeg version 0.8.14, Copyright (c) 2000-2013 the FFmpeg developers
 built on Dec 11 2013 13:48:02 with gcc 4.4.3
 configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame --enable-libvpx
 libavutil 51. 9. 1 / 51. 9. 1
 libavcodec 53. 8. 0 / 53. 8. 0
 libavformat 53. 5. 0 / 53. 5. 0
 libavdevice 53. 1. 1 / 53. 1. 1
 libavfilter 2. 23. 0 / 2. 23. 0
 libswscale 2. 0. 0 / 2. 0. 0
 libpostproc 51. 2. 0 / 51. 2. 0
Input #0, mpegts, from 'sample.m2t':
 Duration: 00:00:16.10, start: 0.440156, bitrate: 19697 kb/s
 Program 1
 Stream #0.0[0x200]: Video: mpeg2video (Main), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 24000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
 Stream #0.1[0x201]: Audio: aac, 48000 Hz, stereo, s16, 243 kb/s
At least one output file must be specified

欲しい情報はvideoの解像度なので,下から3行目の所(15行目).Stream~~~1920×1080~~~~が欲しいのです.
次にこれをパイプでgrepに渡すんですが,この表示は標準エラー出力になってるみたいです.ですので,このままパイプを通してgrepしても結果が変わりません.

~$ ffmpeg -i sample.m2t | grep video
ffmpeg version 0.8.14, Copyright (c) 2000-2013 the FFmpeg developers
 built on Dec 11 2013 13:48:02 with gcc 4.4.3
 configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame --enable-libvpx
 libavutil 51. 9. 1 / 51. 9. 1
 libavcodec 53. 8. 0 / 53. 8. 0
 libavformat 53. 5. 0 / 53. 5. 0
 libavdevice 53. 1. 1 / 53. 1. 1
 libavfilter 2. 23. 0 / 2. 23. 0
 libswscale 2. 0. 0 / 2. 0. 0
 libpostproc 51. 2. 0 / 51. 2. 0
Input #0, mpegts, from 'sample.m2t':
 Duration: 00:00:16.10, start: 0.440156, bitrate: 19697 kb/s
 Program 1
 Stream #0.0[0x200]: Video: mpeg2video (Main), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 24000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
 Stream #0.1[0x201]: Audio: aac, 48000 Hz, stereo, s16, 243 kb/s
At least one output file must be specified

ですので,まずは,標準エラー出力を標準出力側に変換して(2>&1)

~$ ffmpeg -i sample.m2t 2>&1
ffmpeg version 0.8.14, Copyright (c) 2000-2013 the FFmpeg developers
 built on Dec 11 2013 13:48:02 with gcc 4.4.3
 configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame --enable-libvpx
 libavutil 51. 9. 1 / 51. 9. 1
 libavcodec 53. 8. 0 / 53. 8. 0
 libavformat 53. 5. 0 / 53. 5. 0
 libavdevice 53. 1. 1 / 53. 1. 1
 libavfilter 2. 23. 0 / 2. 23. 0
 libswscale 2. 0. 0 / 2. 0. 0
 libpostproc 51. 2. 0 / 51. 2. 0
Input #0, mpegts, from 'sample.m2t':
 Duration: 00:00:16.10, start: 0.440156, bitrate: 19697 kb/s
 Program 1
 Stream #0.0[0x200]: Video: mpeg2video (Main), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 24000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
 Stream #0.1[0x201]: Audio: aac, 48000 Hz, stereo, s16, 243 kb/s
At least one output file must be specified

見た目は変わらないけど,こうやって,それからgrepする.

~$ ffmpeg -i sample.m2t 2>&1 | grep video
 Stream #0.0[0x200]: Video: mpeg2video (Main), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 24000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc

このデータをパイプでsedに送り,正規表現を使って切り貼りする.
sedはEDエディタを使ったことがあるなら,すぐに使えるでしょうw EDエディタ万歳w(普通は使わないw

~$ ffmpeg -i sample.m2t 2>&1 | grep video | sed -E 's/.*\s([0-9]{3,4}x[0-9]{3,4}).*/\1/'
1920x1080

正規表現が面倒くさいのが難点ですが,jsonつかって,オブジェクトがなんだ,変数の型がなんだ,構造体がなんだ,と気にするよりも楽ですね.
スキルアップのためにjson使ってみたけど,やっぱりこっちが私に合ってるのかな.数分で作れたよ.jsonだと半日悩んだのに・・・

Linux,PC関係,徒然なる日記|2014年11月5日|1:06 AM|コメント(3)			



“パソコンの話題が続きますが.” への3件のフィードバック

  1. white より:

    はじめまして。
    PT3で録画したものを手っ取り早くエンコードし軽量化を図りたく検索し辿り着きました。
    前日の日記のコードを元にffmpegの場所,preset設定,拡張子(*.ts)のみ変更したものを実行したところ,
    ConvertFrom-Json
    が認識されないとのエラーがでた為,この日記に記載しされている方法でのサイズの取得をしたいのですが,上手く書けません。
    ※以下失敗
    if($SIZE -eq “-1″){
    $SIZE=”-s ” + “$FFMPEG -i $TMP_DIR\$TMPNAME$IN_EXT 2>&1 | grep video | sed -E ‘s/.*\s([0-9]{3,4}x[0-9]{3,4}).*/\1/'”
    }
    PowerShellではgrepが使えないみたいなので,代替案などによる方法があればご教授頂けると幸いです。
    宜しくお願い致します。

    • arrumis より:

      大変申し判りませんでした.この記事はLinux上で動かしたものです.その一文を記載しておりませんでした.

      大慌てで,windows上で動くものを考えてみました.

      私はIT関係の専門家では無いので,かなり甘いプログラムなのかもしれませんが,それでも参考になればと,新しい日記を書きました(http://ponkotu.org/?p=1061)
      どうぞご参考にしてください.

  2. […] 先日書いた日記(これ)に一言書き忘れていまして,混乱された方が居られるようで.申し訳ないです. […]

« »