酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

ffmpegを使って動画編集する

動画編集を扱うので一番簡単なのは ffmpeg を使うことです。

macOSへのインストール

$ brew install ffmpeg

ffmpegのインストールはものすごい時間がかかります。正確な時間は計測していませんが、MacBook Proでも20分くらい。インストールというよりダウンロードしてからビルドしている感じがします。

ffmpegを使って動画編集する

f:id:ch3cooh393:20200529201135j:plain

動画の情報を取得する

ffprobe -show_streams /PATH/sample.mov 

フォーマットを指定して出力したい場合 -print_format json を指定します。

ffprobe -show_streams -print_format json /PATH/sample.mov 

を実行すると下記のJSONが得られる。本当にJSONフォーマットなのか?と思わなくもないが……

{
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/PATH/input.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2020-03-30T12:49:57.000000Z
    com.apple.quicktime.location.ISO6709: LOCATION
    com.apple.quicktime.make: Apple
    com.apple.quicktime.model: iPhone 11 Pro
    com.apple.quicktime.software: 13.3.1
    com.apple.quicktime.creationdate: 2020-03-30T21:49:57+0900
  Duration: 00:00:02.07, start: 0.000000, bitrate: 7497 kb/s
    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1920x1080, 7308 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 600 tbc (default)
    Metadata:
      creation_time   : 2020-03-30T12:49:57.000000Z
      handler_name    : Core Media Video
      encoder         : HEVC
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 135 kb/s (default)
    Metadata:
      creation_time   : 2020-03-30T12:49:57.000000Z
      handler_name    : Core Media Audio
    Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2020-03-30T12:49:57.000000Z
      handler_name    : Core Media Metadata
    Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
    Metadata:
      creation_time   : 2020-03-30T12:49:57.000000Z
      handler_name    : Core Media Metadata
    Stream #0:4(und): Data: none (mebx / 0x7862656D), 17 kb/s (default)
    Metadata:
      creation_time   : 2020-03-30T12:49:57.000000Z
      handler_name    : Core Media Metadata
Unsupported codec with id 0 for input stream 2
Unsupported codec with id 0 for input stream 3
Unsupported codec with id 0 for input stream 4
    "streams": [
        {
            "index": 0,
            "codec_name": "hevc",
            "codec_long_name": "H.265 / HEVC (High Efficiency Video Coding)",
            "profile": "Main",
        
// ... (中略)
            "tags": {
                "creation_time": "2020-03-30T12:49:57.000000Z",
                "language": "und",
                "handler_name": "Core Media Metadata"
            }
        }
    ]
}

動画フォーマットを変換する

movをgitに変換する。

ffmpeg -i /PATH/input.mov /PATH/output.gif

mp4に変換したい場合は下記のように拡張子を変更します。

ffmpeg -i /PATH/input.mov /PATH/output.mp4

動画のサムネイル画像を取得する

ffmpeg -ss 1 -i /PATH/input.mov -vframes 1 /PATH/output.jpg

サムネイルフィルタを利用してもサムネイルが画像を取得することができる。

ffmpeg -i /PATH/input.mov -vf thumbnail -frames:v 1 /PATH/output.jpg

クロップ領域を切り出して動画を生成する

横幅320px、高さ480px、切り出すx座標、切り出すy座標とする場合。

ffmpeg -i /PATH/input.mov -vf crop=320:480:200:100 /PATH/output.mp4

f:id:ch3cooh393:20200529193554j:plain

動画をリサイズしたい

横幅320px、高さ480pxの動画にリサイズしたい場合。

ffmpeg -i /PATH/input.mov -s 320x480 /PATH/output.mp4

f:id:ch3cooh393:20200529193105j:plain

アスペクト比を保持したまま 横幅320pxの動画にリサイズする場合。

ffmpeg -i /PATH/input.mov -vf scale=320:-1 /PATH/output.mp4

f:id:ch3cooh393:20200529193321j:plain

アスペクト比を保持したまま 縦幅480pxの動画にリサイズする場合。

ffmpeg -i /PATH/input.mov -vf scale=-1:480 /PATH/output.mp4

f:id:ch3cooh393:20200529193448j:plain

動画にウォーターマーク(ロゴ)をつける

ロゴを用意した。

f:id:ch3cooh393:20200601204543p:plain

ffmpeg -i /PATH/input.mov -i /PATH/logo1.png -filter_complex overlay /PATH/output.mp4

実行すると、こうなる。パラメータを与えない場合は左上固定になるのだと思われる。

f:id:ch3cooh393:20200601204656j:plain

動画をクロッピングしてからウォーターマークをつける

ffmpeg -i /PATH/input.mov -i /PATH/logo1.png \
    -filter_complex "[0]crop=320:480:200:100[a];[a][1]overlay"  /PATH/output.mp4

f:id:ch3cooh393:20200601205626j:plain

動画に複数のウォーターマーク(ロゴ)をつける

このふたつのウォーターマークをつけたい。

f:id:ch3cooh393:20200601204543p:plainf:id:ch3cooh393:20200601210236p:plain
ffmpeg -i /PATH/input.mov -i /PATH/logo1.png -i /PATH/logo2.png  \
    -filter_complex "[0:v][1:v]overlay=0:0[b];[b][2:v]overlay=0:100" /PATH/output.mp4

f:id:ch3cooh393:20200601210532j:plain

クロッピングしたあとに複数のウォーターマーク(ロゴ)をつける

ffmpeg -i /PATH/input.mov -i /PATH/logo1.png -i /PATH/logo2.png   \
    -filter_complex "[0:v]crop=320:480:200:100[a];[a][1:v]overlay=0:0[b];[b][2:v]overlay=0:100" /PATH/output.mp4

f:id:ch3cooh393:20200601210401j:plain

動作確認環境

  • macOS Catalina 10.15.5
  • ffmpeg v4.2.3

ffmpegのバージョン(とプラグイン?)は下記の通り。

ffmpeg version 4.2.3 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 11.0.3 (clang-1103.0.32.59)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.3 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags=-fno-stack-check --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100