Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 311 articles
Browse latest View live

サンプリング周波数を変えずにテンポとピッチを変える rubberband

$
0
0

今まではテンポ(再生速度)を変えるには atempo を、ピッチ(高低)を変えるには asetrate を使っていたが、rubberbandasetrate で変わる周波数を変えずにピッチとテンポを変えることができる。

rubberband は別途ライブラリをインストールしないと使えないのと、現在は 64bit に未対応である。

続きを読む

インストールする

git clone git://github.com/lachs0r/rubberband rubberband
cd rubberband
make && make install

これでインストールできるが、Makefile の冒頭に PREFIX でインストール場所を指定できる。XhmikosR’s Builds を使っている場合は cc がなくエラーが出るので MSYS/mingw/bin/gcc.exe を MSYS/mingw/bin/cc.exe にコピー&リネームする。

ffmpeg の configure オプションには
--enable-librubberband --pkg-config-flags="--static" をつける。

公式ドキュメント:FFmpeg Filters Documentation :: rubberband

オプション

詳細にオプションが指定できるが説明は省略。

  • tempo
    テンポ(音声再生速度)指定。規定値:1
  • pitch
    ピッチ(音の高さ)指定。規定値:1
  • transients
    • crisp
    • mixed
    • smooth
  • detector
    • compound
    • percussive
    • soft
  • phase
    • laminar
    • independent
  • window
    • standard
    • short
    • long
  • smoothing
    • off
    • on
  • formant
    • shifted
    • preserved
  • pitchq
    • quality
    • speed
    • consistency
  • channels
    • apart
    • together

基本コマンド

2倍速再生にする(映像は2倍速にはならない)
ffplay input -af rubberband=tempo=2

映像も2倍速再生にする
ffplay input -vf setpts=1/2*PTS -af rubberband=tempo=2
ffplay input -vf setpts=1/2*PTS -af atempo=2


ffmpeg 2.8.1 リリース

$
0
0

ffmpeg 2.8.1 が2015年10月14日リリースされた。今回のアップデートは修正が主で最新gitで公開されている新規のフィルタは追加されていない。

Update for 2.8.1 : git.videolan.org Git – ffmpeg.git/blobdiff – Changelog

最新git で公開されているフィルタはこちらから
git.videolan.org Git – ffmpeg.git/blob – Changelog

extrastereo filter
ocr filter
alimiter filter
stereowiden filter
stereotools filter
rubberband filter
tremolo filter
agate filter
chromakey filter
maskedmerge filter
displace filter
selectivecolor filter

この中で既に書いているのが、
stereowiden Windows の ffmpeg で生放送する方法 : stereowiden(立体音響化)
rubberband サンプリング周波数を変えずにテンポとピッチを変える rubberband
chromakey ffmpeg でクロマキー合成 その2
maskedmerge マスクして2入力を合わせる maskedmerge

別途ライブラリが必要な ocr は学習させないと日本語がほとんど読み取れないので日本語での実用性はかなり低い。selectivecolor は次回更新予定。

RGB, CMYK を個別に調整できる selectivecolor

$
0
0

現時点では最新git からでしか使えない。

RGB を個別に明るくしたり暗くしたりできるフィルタに colorbalance があるが、このフィルタは RGB だけではなく CMYK に対しても明るくしたり、暗くしたり、他の色を混ぜたり出来る。Adobe Photoshop の 特定色域の選択ツールに似ていて、Photoshop の .asv が読み込める。

具体的にどのようなことができるかは「photoshop 特定色域の選択(bing)」で検索するといろいろ見つかる。

Windows の ffmpeg で生放送する方法 : colorbalance

公式ドキュメント:FFmpeg Filters Documentation :: selectivecolor

続きを読む

オプション

  • correction_method
    色調整の方法を決める
    • absolute
      絶対値。規定値
      指定した値の増減が反映される
    • relative
      相対値
      元の値に指定した値を掛けた値が反映される
  • reds
    RGB(255,0,0)。以下の色は -1 から 1 まで指定できる
  • yellows
    RGB(255,255,0)
  • greens
    RGB(0,255,0)
  • cyans
    RGB(0,255,255)。やや緑みの明るい青。
  • blues
    RGB(0,0,255)
  • magentas
    RGB(255,0,255)。明るい赤紫。
  • whites
    全てのRGBが128より大きい
  • neutrals
    真っ白と真っ黒以外の全て
  • blacks
    全てのRGBが128より小さい
  • psfile
    .asv のファイルパスを指定する

基本コマンド

色のオプションは4つまでスペースを挟んで指定でき、順番に CMYK(cyan, magenta, yellow, key plate) の色を混ぜることが出来る。出力カラーフォーマットは bgr0 になる。使い方は調整したい色を指定し、4つの引数で混ぜたい色を指定する。

緑の部分にシアンを50%増して黄を33%減らし、青の部分にマジェンタを27%増す
ffplay input -vf "selectivecolor=greens=.5 0 -.33 0:blues=0 .27"

MySelectiveColorPresets フォルダにある Misty.asv を読み込む
バイナリデータなのでテキストエディタでは編集できない。サンプルファイル
ffplay input -vf "selectivecolor=psfile=MySelectiveColorPresets/Misty.asv"

トーンカーブで RGB の調整が出来る curves

$
0
0

個別の RGB でも RGB すべてでもトーンカーブで色の調整ができる curves は Adobe Photoshop や Gimp などのペイントツールによくある機能でこれが ffmpeg でも使える。ペイントツールで同時に表示されるヒストグラムは histogram で表示できるが、Photoshop のようなメリハリの付いたグラフではなくて Gimp に近い感じになる。また Photoshop のトーンカーブプリセット .acv が読み込める。

公式ドキュメント:FFmpeg Filters Documentation :: curves

続きを読む

オプション

  • preset
    プリセットを指定する
    • color_negative
      “curves=r=0/1 0.129/1 0.466/0.498 0.725/0 1/0:g=0/1 0.109/1 0.301/0.498 0.517/0 1/0:b=0/1 0.098/1 0.235/0.498 0.423/0 1/0”
    • cross_process
      “curves=r=0.25/0.156 0.501/0.501 0.686/0.745:g=0.25/0.188 0.38/0.501 0.745/0.815 1/0.815:b=0.231/0.094 0.709/0.874”
    • darker
      “curves=all=0.5/0.4”
    • increase_contrast
      “curves=all=0.149/0.066 0.831/0.905 0.905/0.98”
    • lighter
      “curves=all=0.305/0.286 0.694/0.713”
    • linear_contrast
      “curves=all=0.305/0.286 0.694/0.713”
    • medium_contrast
      “curves=all=0.286/0.219 0.639/0.643”
    • negative
      “curves=all=0/1 1/0”
    • strong_contrast
      “curves=all=0.301/0.196 0.592/0.6 0.686/0.737”
    • vintage
      “curves=r=0/0.11 0.42/0.51 1/0.95:g=0.50/0.48:b=0/0.22 0.49/0.44 1/0.8”
  • red, r
    赤を調整する
  • green, g
    緑を調整する
  • blue, b
    青を調整する
  • all
    赤緑青を調整する
  • psfile
    Photoshop カーブプリセット(.acv)のファイルパスを指定する

基本コマンド

青の中央値を少し明るくする
ffplay input -vf "curves=blue='0.5/0.58'"

ビンテージプリセットを指定する
ffplay input -vf "curves=r='0/0.11 .42/.51 1/0.95':g='0.50/0.48':b='0/0.22 .49/.44 1/0.8'"
ffplay input -vf curves=vintage

Photoshop カーブプリセットを指定して緑も調整する
ffplay input -vf "curves=psfile='MyCurvesPresets/purple.acv':green='0.45/0.53'"

調整前後を histogram で比較して調べる
RGB画像を入力する場合は format=gbrp を挟む
ffplay input_img -vf "format=gbrp,split[0][1];[0]curves=blue='0.5/0.4',histogram=mode=levels:levels_mode=logarithmic,scale=200:ih,split[l0][l1];[1]histogram=mode=levels:levels_mode=logarithmic,scale=200:ih,split[r0][r1];[l1][r1]blend=c0_mode=difference128[d0];[l0][r0][d0]hstack=3,drawgrid=0:0:20:20:c=0xd0d0d0"

関連記事
ffmpeg でヒストグラムを表示する

Zライブラリを使ったリサイズフィルタ zscale

$
0
0

scale と同じようにリサイズ出来るフィルタだが、それとは別のリサイズ方法 point, spline16, spline36 が使える。ただし scale と比べ処理が速くないのでリアルタイムエンコード、つまり配信用途なら処理が遅くても問題ない。scale と違ってインターレース保持のリサイズは出来ない。現時点では ffmpeg の master で使える。

ffmpeg の scale で使えるリサイズ方法:FFmpeg Scaler Documentation :: Scaler Options

公式ドキュメント:FFmpeg Filters Documentation :: zscale

続きを読む

インストール方法

releases では v2.0 以上を使う。

$ git clone git://github.com/sekrit-twc/zimg zimg
$ cd zimg
$ autogen.sh
$ ./configure --prefix="/mingw/i686-w64-mingw32"  --build="i686-w64-mingw32" --host="i686-w64-mingw32"
$ make -j 2 && make install

ffmpeg には --enable-libzimg をつけて、実行には bin にインストールされた libzimg-2.dll が必要。

libzimg-2.dll を個別にしない場合は zimg の configure に
--disable-shared --enable-static をつけて、
zimg.pc の Libs: に -lstdc++ を追加する。

Libs: -L${libdir} -lzimg -lstdc++

オプション

  • width, w
    出力解像度の横幅
    0 は入力と同じ。-1 はアスペクト比を揃えて縦解像度に合わせる
  • height, h
    出力解像度の縦幅
    0 は入力と同じ。-1 はアスペクト比を揃えて横解像度に合わせる
  • size, s
    横幅x縦幅。使える書式
  • dither, d
    ディザーオプション
    • none。規定値
    • ordered
    • random
    • error_diffusion
  • filter, f
    リサイズアルゴリズム
    • point
    • bilinear。規定値
    • bicubic
    • spline16
    • spline36
    • lanczos
  • range, r
    カラーレンジ
    • input。規定値
    • limited
    • full
  • primaries, p
    カラープライマリー
    • input。規定値
    • 709
    • unspecified
    • 170m
    • 240m
    • 2020
  • transfer, t
    トランスファー
    • input。規定値
    • 709
    • unspecified
    • 601
    • linear
    • 2020_10
    • 2020_12
  • matrix, m
    色空間マトリクス
    • input。規定値
    • 709
    • unspecified
    • 470bg
    • 170m
    • 2020_ncl
    • 2020_cl

縦横幅に使える書式

  • in_w, iw
    入力横幅
  • in_h, ih
    入力縦幅
  • out_w, ow
    出力横幅
  • out_h, oh
    出力縦幅
  • a
    iw / ih
  • sar
    サンプルアスペクト比
  • dar
    (iw / ih) * sar
  • hsub, vsub
    入力クロマサブサンプル値。yuv422p だと hsub は 2、vsub は 1
  • ohsub, ovsub
    出力クロマサブサンプル値。yuv422p だと hsub は 2、vsub は 1

基本コマンド

横幅640に縦幅はアスペクト比を揃えて bilinear のディザーなしにリサイズ
ffmpeg -i input -vf zscale=640:-1 -c:a copy output

横幅を半分に縦幅はアスペクト比を揃えて spline16 のディザーなしにリサイズ
配信用途では指定解像度に spline16 のディザーなしがおすすめ
ffmpeg -i input -vf zscale=iw/2:-1:f=spline16 -c:a copy output

特定の区間だけフィルタを当てるタイムライン編集について

$
0
0

ffmpeg のフィルタの中には区間、以上、未満、毎の時間の条件をつけることができるものがある。これらをつけられるのは filters で調べたときに T と表示されるフィルタである。


ffmpeg -filters

使い方

10秒から180秒まで smartblur をかける
smartblur=enable='between(t,10,3*60)'
3秒以降から curves のプリセット cross_process を指定する
curves=enable='gte(t,3)':preset=cross_process
1秒から3秒までと4秒から5秒まで cross_process をかける
noise=enable='between(t,1,3)+between(t,4,5)':alls=100:allf=t+u
2秒ごとに1秒間 smartblur をかける
smartblur=enable='between(t,t*mod(t\,2),t)'
3秒ごとに3n-2秒から3n秒までの2秒間 smartblur をかける
smartblur=enable='between(t,t,t*mod(t\,3))'

この書式が使える:ffmpeg で使える計算書式

タイムライン編集ができるフィルタの中から紹介したことのある記事

blend ffmpeg で差分動画を作る
chromakey ffmpeg でクロマキー合成 その2
colorbalance Windows の ffmpeg で生放送する方法 : カラーバランス
colorchannelmixer colorchannelmixer の使い方
colorkey ffmpeg でクロマキー合成
colormatrix Youtube にアップロードする時に注意する colormatrix の設定
curves トーンカーブで RGB の調整が出来る curves
delogo ffmpeg できれいにロゴを消す方法
dilation ffmpeg で OpenCV フィルタを使う
drawbox ニコ生のTSからサムネイルを出力する【ffmpeg】動画から特定フレームを画像で出力する方法
drawgrid トーンカーブで RGB の調整が出来る curves
drawtext YUV、彩度、色相 を見える化する signalstatsWindows の ffmpeg で生放送する方法 : テキスト
edgedetect ffmpeg でエッジ検出をする
erosion ffmpeg で OpenCV フィルタを使う
framestep 【ffmpeg】動画から特定フレームを画像で出力する方法
hqdn3d ニコ生で使うデノイズフィルタの例Windows の ffmpeg で生放送する方法 : 3次元デノイズフィルタ
lut ffmpeg できれいにロゴを消す方法
maskedmerge マスクして2入力を合わせる maskedmerge
pp ニコ生で使うデノイズフィルタの例
removelogo ffmpeg できれいにロゴを消す方法
selectivecolor RGB, CMYK を個別に調整できる selectivecolor
smartblur ffmpeg でモーションブラーを掛ける
unsharp ニコ生で使うデノイズフィルタの例
w3fdif ffmpeg でインターレース解除
yadif ffmpeg でインターレース解除

ffmpeg で無限入力が可能に

$
0
0

今までは -loop 1 で画像の無限入力はできていたが、これからは音声や映像も無限に入力できるようになった。

対象コミット:support infinite loop for the loop option : git.videolan.org Git – ffmpeg.git/commitdiff
公式ドキュメント:Main options : ffmpeg Documentation

続きを読む

基本コマンド

600秒でカットする
ffmpeg -stream_loop -1 -i input -c copy -t 600 output

3回ループする
ffmpeg -stream_loop 3 -i input -c copy output

制限

上のコマンドでループを指定できるがいくつか制限がある。

  • 2入力をループしてマルチトラックなら可能だが、後ろにつなげる場合はループできない。
  • concat で取り込んでも複数ファイルのループには対応していない。
  • ループしたものをフィルタに取り込んでも1回だけで2回以上ループして取り込めない。
  • 音声だけの場合は指定秒でカットできるが、映像は必ずn回の最初から最後までを出力する。

用途

メイン映像のBGMに使う。但し1ファイルの音源のみ。複数音源は予め連結しておかなければならない
ffmpeg -i movie -stream_loop -1 -i bgm -filter_complex [0:1][1:0]amix output

2音声を連結する。連結する数だけ n の値を増やす
ffmpeg -i input1 -i input2 -filter_complex "concat=n=2:v=0:a=1" output

動く映像を右下に配置する
ffmpeg -i movie -stream_loop -1 -i bgv -filter_complex overlay=W-w:H-h output

オーバーレイする映像をクロマキー処理(緑背景)して透過させる
ffmpeg -i movie -stream_loop -1 -i bgv -filter_complex [1:0]chromakey=green:.03:.1[bgv];[0:0][bgv]overlay=W-w:H-h output

関連記事

【ffmpeg】動画・音声を連結する concat の使い方
Windows の ffmpeg で生放送する方法 : オーバーレイ
ffmpeg でクロマキー合成 その2

輝度の階調を減らして容量を減らす試み

$
0
0

ffmpeg のフィルタで容量を減らすと言えばたいていの場合デノイズしてのっぺりさせてきたが、今回はデノイズではなくてYチャンネル(輝度)の階調を間引いて容量を減らしてみた。この方法のデメリットはのっぺりしたりぼやけたりはしないが階調が単純化されるのでグラデーションがきれいではなくなる(バンディングがのる)のと、処理が遅いのでリアルタイムエンコード(配信)向きである。

任意で階調を調整できるのでバンディングが目立つところを間引かずに他の所を間引くことで目立たないところで容量を減らすことができる。階調の調整は映像の内容によって変えた方がきれいに見える。

追記 2015年11月6日 0時21分
可逆圧縮(utvideo)の時は確かに容量は減るのだが、不可逆圧縮(libx264)のときはかえって容量は増えて SSIM も悪くなる傾向にあるのでもう少し調べてみる。

追記ここまで

続きを読む

基本コマンド

zscale が使える場合は spline16 を使い unsharp は輝度だけ調整する
ffmpeg -i video -i img.png -filter_complex [0:0]scale=iw/2:-1,format=yuv420p,extractplanes=y+u+v[y0][u][v];[y0]unsharp=3:3:0.5[y1];[y1][1:0]paletteuse=dither=none:bayer_scale=5,format=yuv420p[y2];[y2][u][v]mergeplanes=0x001020:yuv420p out

1/2リサイズ限定。上よりかなり処理が遅くなるが上の zscale よりほんの少し容量が減る。unsharp は輝度だけ調整する
ffmpeg -i video -i img.png -filter_complex [0:0]extractplanes=y+u+v[y0][u][v];[y0]zscale=iw/2:-1:f=spline16,unsharp=3:3:0.5[y1];[y1][1:0]paletteuse=dither=none:bayer_scale=5,format=yuv420p[y2];[y2][u][v]mergeplanes=0x001020:yuv444p,format=yuv420p out

フィルタ内容

  1. extractplanes で Yチャンネルを取り出す
  2. パレット画像に paletteuse を適応して Yチャンネルで使う色を間引く
  3. 間引いた Yチャンネルを mergeplanes で合わせる

パレット画像

普段使っている画像編集ツールでもよいが、ドット単位の編集には PictBear がおすすめ。画像は 16×16 の 256色使うことができ、基本となる画像の色は 0 から 255 までのグレイスケールと透過の 256パターンである。適宜間引く場合は黒で塗りつぶす。右クリックから保存する。

何も間引いていないパレット画像(これを基本とする)

均等に半分間引いたパレット画像

暗い部分を中心に間引いたパレット画像

間引く色を調べる

Yチャンネルはグレイスケールなのでそのまま出力することで、グラデーションを残したい部分を修正できる。色を調べるのに SpotColor を使っている。

1枚画像の場合
ffmpeg -i input -vf extractplanes=y -an -vframes 1 output.png

動画出力の場合(適宜開始と終了時間を指定する)
ffmpeg -ss 0 -i input -t 10 -vf extractplanes=y -an -vcodec utvideo output.mkv

関連記事


ffmpeg 2.8.2 リリース

$
0
0

今回も前回同様に修正がメインで新機能は追加されていない。ショートログを見ると分かるがあまりコミットされていない。

http://git.videolan.org/?p=ffmpeg.git;a=shortlog;h=refs/tags/n2.8.2

master で新たに追加されたフィルタでブログで紹介しているのは zscale filter だけである。
Zライブラリを使ったリサイズフィルタ zscale

master で公開されているフィルタはこちらから
git.videolan.org Git – ffmpeg.git/blob – Changelog

これとは別に Nvidia のハードウェアアクセレーションのリサイズパッチが Ubuntu 向けに公開されている。
http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf

ニューラルネットワーク予測を使ってインターレース解除する nnedi

$
0
0

ニューラルネットワーク予測のエッジ補正からインターレースを解除するフィルタ nnedi の使い方。既存のインターレース解除フィルタ yadifw3fdif、現時点では master の bwdif に比べてかなり処理速度の遅いフィルタである。今までは AviSynth や Vapoursynth で使われているフィルタなのでそちらで検索すると使い方を調べることができる。rpow は組み込まれていないのでアップスケールには使えない。

基本コマンド

プレビューがもたつくかもしれない
ffplay input -vf nnedi=deint=all:field=a:planes=7:nsize=s32x4:nns=n32:qual=fast:etype=a:pscrn=new

公式ドキュメント:FFmpeg Filters Documentation :: nnedi

オプション

BeanのAviUtlプラグイン置き場 より nnedi3 for AviUtl ver 0.9.4.1 (2011-07-22) の nnedi3.txt を参考にしている。

  • weights
    バイナリファイルを指定する
    https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin
    View Raw から保存する。これを参照しなとフィルタが使えない
    ffmpeg と同じ場所に置く
    規定値:nnedi3_weights.bin
  • deint
    どのフレームを処理するか
    • all。規定値
    • interlaced
  • field
    インターレース解除してBob化するかしないか、フィールドオーダーを変えるか維持するか
    • af
      Bob化しフィールドオーダーは変えない
    • a
      Bob化せずフィールドオーダーは変えない。規定値
    • t
      Bob化せずトップフィールド維持
    • b
      Bob化せずボトムフィールド維持
    • tf
      Bob化しトップフィールドファースト
    • bf
      Bob化しボトムフィールドファースト
  • planes
    どのチャンネルを処理対象にするか
    0 から 7 まで[int]
    規定値:7
  • nsize
    ニューラルネットワーク予測で参照する局所近傍サイズを指定する。縦x横
    • s8x6
    • s16x6
    • s32x6
    • s48x6
    • s8x4
    • s16x4
    • s32x4。規定値
  • nns
    ニューラルネットワーク予測器のニューロンの数を指定する。縦x横
    数値が大きいほど処理速度を犠牲にして品質を上げる
    • n16
    • n32。規定値
    • n64
    • n128
    • n256
  • qual
    最終的な出力値を計算するためにブレンドされた異なるニューラルネットワーク予測数を制御する。簡単に言えば品質指定。slow にすると処理速度を犠牲にして品質を上げる
    • fast。規定値
    • slow
  • etype
    ニューラルネットワーク予測で用いる重みを選択する
    • a
      絶対誤差を最小にするよう学習された重みを用いる。規定値
    • s
      二乗誤差を最小にするよう学習された重みを用いる
  • pscrn
    事前にニューラルネットワーク予測での補正が必要かどうか、必要ならどのピクセルを指定するか
    指定してもしなくても目で見て分かるほどの差はでない
    • none
    • original
    • new。規定値
  • fapprox
    デバグフラグの指定
    0 から 3 まで[int]
    規定値:0

映像の2カ所を入れ替える swaprect

$
0
0

指定した座標から四角い範囲を入れ替える swaprect の使い方。数値に ntpos が使えるので時間の経過で座標を変えることができる。

基本コマンド

  • テストソース


  • 左上と右下を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=w/2:y1=h/2:x2=0:y2=0
    左上と右下を入れ替える


  • 右上と左下を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=w/2:y1=0:x2=0:y2=h/2
  • 左上と左下を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=0:y1=h/2:x2=0:y2=0
  • 右上と右下を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=w/2:y1=0:x2=w/2:y2=h/2
  • 左上と右上を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=0:y1=0:x2=w/2:y2=0
  • 左下と右下を入れ替える
    ffplay input -vf swaprect=w=w/2:h=h/2:x1=0:y1=h/2:x2=w/2:y2=h/2

公式ドキュメント:FFmpeg Filters Documentation :: swaprect

オプション

  • w
    入れ替える長方形の横幅
    既定値:w/2
  • h
    入れ替える長方形の縦幅
    既定値:h/2
  • x1
    入れ替える長方形の左上のX座標
    既定値:w/2
  • y1
    入れ替える長方形の左上のY座標
    既定値:h/2
  • x2
    入れ替えた先の長方形の左上のX座標
    既定値:0
  • y2
    入れ替えた先の長方形の左上のY座標
    既定値:0
  • 以下のオプションが数値として代替できる
    • w
      入力解像度の横幅
    • h
      入力解像度の縦幅
    • a
      h/w
    • sar
      アスペクト比
    • dar
      (w/h)*sar
    • n
      入力したファイルのフレーム数。0 開始
    • t
      入力したファイルのタイムスタンプ秒
    • pos
      入力したファイルのフレーム位置

注意点

四角い範囲と入れ替える、または入れ替えた先の座標の右上または左下が解像度を超えた場合はフィルタが無効になる。

w/2+w/2+1=w+1 で入れ替えた先の長方形の幅が解像度幅を超えた例
ffplay input -vf swaprect=w=w/2:h=h/2:x1=w/2+1:y1=0:x2=0:y2=h/2

指定したチャンネルの周波数帯の音量を変える anequalizer

$
0
0

指定したチャンネルの周波数帯の音量を変えられる anequalizer の使い方。チャンネル毎に設定でき、設定方法も直感的なので使いやすい。似たフィルタに compand があるが、こちらは DTM の設定になれている人向け。

Windows の ffmpeg で生放送する方法 : compand

基本コマンド

ステレオ音声を読み込み c0(FL)の周波数4000Hzの前後100Hzを -10dBにする。c1(FR)も同様
ffplay input -af "anequalizer=c0 f=4000 w=200 g=-10 f=0|c1 f=4000 w=200 g=-10 f=0"

showspectrumpic を併用すると効果の具合が視覚的に分かる。
ffmpeg -i input -filter_complex "anequalizer=c0 f=4000 w=200 g=-20|c1 f=4000 w=200 g=20",showspectrumpic=s=1024x1024:mode=separate anequalizer.png

anequalizer と showspectrumpic を併用して効果を見える化


公式ドキュメント:FFmpeg Filters Documentation :: anequalizer

オプション

  • params
    音量を変える周波数と音量を指定する
    • chn
      チャンネル番号を指定
      例:c0(FL), c1(FR)
    • cf
      適用する周波数
    • w
      適用する周波数帯
    • g
      音量の変化
    • f
      音量変化のアルゴリズム
      • 0
        バターワース。規定値
      • 1
        第一種チェビシェフフィルタ
      • 2
        第二種チェビシェフフィルタ
  • curves
    周波数を映像化する。以下の映像オプションの使い方が分からない
    規定値:0
  • size
  • mgain
  • fscale
  • colors

こもった音や割れた音に変える aemphasis

$
0
0

LPレコードやCDなどのフィルタカーブで強調された素材を作成または復元する aemphasis の使い方。音割れさせたりこもった音に変えたりできる。

基本コマンド

ffplay input -af aemphasis=level_in=1:level_out=1:mode=reproduction:type=cd

公式ドキュメント:FFmpeg Filters Documentation :: aemphasis

オプション

  • level_in
    入力利得調整
    0 から 64 まで[double]
    規定値:1
  • level_out
    出力利得調整
    0 から 64 まで[double]
    規定値:1
  • mode
    • reproduction
      復元モード。音がこもる。規定値
    • production
      作成モード。高音帯の音量が大きくなる
  • type
    • col
      コロンビアタイプ。規定値
    • emi
      EMIタイプ
    • bsi
      BSI (78RPM)タイプ
    • riaa
      RIAAタイプ
    • cd
      CDタイプ
    • 50fm
      50μS(FM)タイプ
    • 75fm
      75μS(FM)タイプ
    • 50kf
      50μS(FM-KF)タイプ
    • 75kf
      75μS(FM-KF)タイプ

音量を脈打つように上げ下げできる apulsator

$
0
0

apulsator はオートパンやトレモロの中間的なフィルタである。ffmpeg では pantremolo で使える。左右のチャンネルの位相や波形をずらしたりする LFO (low frequency oscillator) を元に音量を変える。オフセットが 0 のときはトレモロと同じように左右のチャンネルを等しく変える。オフセットが 0.5 のときはオートパンのように周波数の半分の位相をずらす。オフセットが 1 のときは再び等しく変え、1 に近づくほどより早く右から左へのスピーカーに音が渡されずれが小さくなる。

基本コマンド

ffplay input -af apulsator=level_in=1:level_out=1:mode=sine:1:amount=1:offset_l=0:offset_r=0.5:width=1:timing=hz:hz=2

ahistogram を併用するとずれ具合が見える化する
ffplay -f lavfi amovie=input,apulsator=level_in=1:level_out=1:mode=sine:1:amount=.8:offset_l=.6:offset_r=1:width=1:timing=bpm:hz=2,ahistogram=dmode=separate:r=25:s=hd720:scale=log:ascale=log:acount=1:rheight=.1:slide=replace[out0];amovie=input,apulsator=level_in=1:level_out=1:mode=sine:1:amount=.8:offset_l=.6:offset_r=1:width=1:timing=bpm:hz=2[out1]

音量のヒストグラムを映像化する ahistogram

公式ドキュメント:FFmpeg Filters Documentation :: apulsator

オプション

  • level_in
    入力利得調整
    0.015625 から 64 まで[double]
    規定値:1
  • level_out
    出力利得調整
    0.015625 から 64 まで[double]
    規定値:1
  • mode
    LFO の波形タイプ
    • sine。規定値
    • triangle
    • square
    • sawup
    • sawdown
  • amount
    変調の値指定
    0 から 1 まで[double]
    規定値:1
  • offset_l
    左チャンネルのオフセット値
    0 から 1 まで[double]
    規定値:0
  • offset_r
    右チャンネルのオフセット値
    0 から 1 まで[double]
    規定値:0.5
  • width
    パルスの幅
    0 から 2 まで[double]
    規定値:1
  • timing
    タイミングモード
    bpm, ms, hz が選択可能でそれに対応した数値が以下より設定できる
    規定値:hz
  • bpm
    Beats Per Minute。1分当たりの拍
    30 から 300 まで[double]
    規定値:120
  • ms
    Milli Second。ミリ秒
    10 から 2000 まで[int]
    規定値:500
  • hz
    ヘルツ
    0.01 から 100 まで[double]
    規定値:2

音声統計データを表示する astats

$
0
0

音声統計データを表示する astats の使い方。メタデータ対応しているので出力したログの加工が容易になる。

公式ドキュメント:FFmpeg Filters Documentation :: astats

基本コマンド

ffprobe
ffprobe -f lavfi -i amovie=input,astats=length=0.05:metadata=0:reset=0
ffprobe -f lavfi -i aevalsrc=sin(440*2*PI*t):s=8000:d=1,astats=length=0.05:metadata=0:reset=0

Channel: 1
DC offset: 0.003547
Min level: -1.000000
Max level: 1.000000
Min difference: 0.000000
Max difference: 0.343816
Mean difference: 0.218838
Peak level dB: 0.000000
RMS level dB: -3.009234
RMS peak dB: -3.009234
RMS trough dB: -3.009234
Crest factor: 1.414040
Flat factor: 0.000000
Peak count: 10
Bit depth: 64
Overall
DC offset: 0.003547
Min level: -1.000000
Max level: 1.000000
Min difference: 0.000000
Max difference: 0.343816
Mean difference: 0.218838
Peak level dB: 0.000000
RMS level dB: -3.009234
RMS peak dB: -3.009234
RMS trough dB: -3.009234
Flat factor: 0.000000
Peak count: 10.000000
Bit depth: 64
Number of samples: 1024

ametadata(ffmpeg 3.0 以降のフィルタ)
ffplay -f lavfi -i amovie=input,astats=metadata=1,ametadata=print:key=lavfi.astats.1.DC_offset[out0];movie=input[out1]

adrawgraph
ffplay -f lavfi -i amovie=input,astats=metadata=1,adrawgraph=m1=lavfi.astats.1.DC_offset:min=0.0001:max=0.005

特定のメタデータ、ここでは 1ch(FL) の DC_offset を 1000サンプル毎に表示する
ffprobe -show_entries frame_tags=lavfi.astats.1.DC_offset -of default=noprint_wrappers=1:nokey=1 -v quiet -f lavfi -i amovie=input,astats=length=0.05:metadata=1
公式ドキュメント:FFmpeg Filters Documentation :: astats

オプション

メタデータ形式は lavfi.astats.XX に 1 から始まるチャンネル番号か、Overall が使える
個別チャンネルには DC_offset, Min_level, Max_level, Min_difference, Max_difference, Mean_difference, Peak_level, RMS_peak, RMS_trough, Crest_factor, Flat_factor, Peak_count, Bit_depth
Overall には DC_offset, Min_level, Max_level, Min_difference, Max_difference, Mean_difference, Peak_level, RMS_level, RMS_peak, RMS_trough, Flat_factor, Peak_count, Bit_depth, Number_of_samples
が使える

  • length
    以下の時間幅指定
    RMS peakRMS trough
    0.01 – 10[double]
    規定値:0.05
  • metadata
    メタデータフラグをつける
    0 – 1[boolean]
    規定値:0
  • reset
    何フレーム先を再計算するか
    0 – MAX[int]
    規定値:0
  • ここから先はパラメータの設定
  • DC offset
    振幅の変位、0 スタート
  • Min level
    サンプルレベルの最小値
  • Max level
    サンプルレベルの最大値
  • Min difference
    2連続したサンプルの最小差違
  • Max difference
    2連続したサンプルの最大差違
  • Mean difference
    2連続したサンプルの平均
  • Peak level dB
    ピークレベル
  • RMS level dB
    RMS レベル
  • RMS peak dB
    RMS ピーク値
  • RMS trough dB
    RMS スルー値
  • Crest factor
    RMS レベルに対するピークの標準比(dB ではない)
  • Flat factor
    ピークレベルのシグナル Flatness (同じ値を持つ連続したサンプル)(最大または最小のレベル)
  • Peak count
    最大または最小のレベルに何回届いたか(サンプル数ではない)
  • Bit depth
    音声全体のビット深度、このビット深度がそれぞれのサンプルに使われる

メタデータをコンソールに表示する metadata, ametadata

$
0
0

特定のフィルタで出力されるメタデータを扱うことができる metadata の使い方。ametadata も同じオプションで使うことができる。こちらはコンソールに出力するに対して drawgraph は映像にテキストやグラフで出力する。drawgraph と比べて出力範囲を指定しなくても良いので使いやすい。

メタデータを映像化する drawgraph

基本コマンド

signalstats から YDIF を表示している。
ffplay -f lavfi -i movie=input,signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
unsharp の Y差分を ssim で表示している。
ffplay -i input -vf split[a][b];[b]unsharp[B];[a][B]ssim,metadata=print:key=lavfi.ssim.Y
ebur128 で M, S, I を同時に表示する
ffplay -f lavfi -i amovie=input,ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I[out0];amovie=input[out1]

公式ドキュメント:FFmpeg Filters Documentation :: metadata, ametadata

オプション

  • mode
    出力モードの指定
    print だけ指定するとその条件のメタデータを表示する。function の条件で間に合わない場合に print 以外のモードを組み合わせて最終的に print で VALUE1 を使いメタデータを表示する。サンプルコマンドを示した方がわかりやすいので後述。
    • select
      key, value を選択する(and 条件をつける)
      メタデータは表示しない
    • add
      key, value を追加する(or 条件をつける)
      同じメタデータがあれば何もしない、つまり別のメタデータを追加する
      メタデータは表示しない
    • modify
      key, value の既存の値を変更する
      メタデータは表示しない
    • delete
      value の値があれば削除する、なければ key の値を削除する
      メタデータは表示しない
    • print
      メタデータを表示する
  • key
    全てのモードで使われるが、print モード以外では必須指定項目
  • value
    メタデータの値の指定。modify, add モードでは必須項目
  • function
      value の比較方法
    • same_str
      文字の一致。浮動小数点はマッチしない
    • starts_with
      数値(整数部分)や文字の先頭が一致すればマッチする
      例:1 を指定すれば 1.xxx や 1x.xxx などがマッチする
    • less
      以下
    • equal
      浮動小数点を含む数値の一致
    • greater
      以上
    • expr
      条件に評価式を使う
      ffmpeg で使える計算書式 を参照
  • expr
    function で expr を指定すると使える
    0 は何も出力せず、1 は全て出力する
    • VALUE1
      print 以外のモードで選択した値を再利用する
    • VALUE2
      value で指定した値
  • file
    ログをファイルで出力する
    規定値は指定しないので指定したらファイル名を指定する

オプション解説

select の例

YLOW を 189 以上と 191 以下を組み合わせて両方を満たす条件の例。同じオプションなので print は1つで良い
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=189:function=greater,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=191:function=less,signalstats,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1
YLOWYMIN を組み合わせた例。別のオプションなので print はそれぞれ必要
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=less,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1

add の例

select の条件に add をつけて YLOW 190以下と YMIN 140 以下のどちらかを満たす条件の例。。別のオプションなので print はそれぞれ必要
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1,metadata=add:key=lavfi.signalstats.YMIN:value=140:function=less,signalstats,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1

modify の例

YLOW の条件結果の全てを 140 に書き換える
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=modify:key=lavfi.signalstats.YLOW:value=140,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1

delete の例

YMIN の条件を消して YMAX の条件に切り替えた例
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=delete:key=lavfi.signalstats.YMIN,metadata=select:key=lavfi.signalstats.YMAX:value=0:function=greater,metadata=print:key=lavfi.signalstats.YMAX:function=expr:expr=VALUE1
YMIN の条件を消して再度 YMIN を指定しても出力されない
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=delete:key=lavfi.signalstats.YMIN,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1

ループ回数を指定できる loop, aloop

$
0
0

ffmpeg で無限入力が可能に で追加されていたが、フィルタを掛けて加工することはできなかった。今回はフィルタ内でループするのでループ回数やループした部分にもフィルタが当てられる。

基本コマンド

1回ループして2回読み込む
ffmpeg -i input -filter_complex loop=1:32767:0;aloop=1:2.14748e+009:0

オプション

  • loop
    ループ回数。-1 で無限
    規定値:0[int]
  • size
    ループにどれだけバッファサイズを取るか
    loop ならフレーム数
    最大値:32767
    規定値:0[int64]
    aloop サンプル数
    最大値:2.14748e+009
    規定値:0[int64]
  • start
    ループするときにどの位置からループするか
    loop ならフレーム数
    規定値:0[int64]
    aloop サンプル数
    規定値:0[int64]

フィルタのベンチマークを調べることができる bench, abench

$
0
0

平均負荷と最大負荷、最小負荷を調べることができる。

基本コマンド

縦横半分に scale でリサイズしたベンチマーク
ffplay input -vf bench=start,scale=iw/2:-1,bench=stop

compand のベンチマーク
ffplay input -af abench=start,compand,abench=stop
Windows の ffmpeg で生放送する方法 : compand

公式ドキュメント:FFmpeg Filters Documentation :: bench, abench

オプション

action
開始または終了を指定する
規定値:0[int]

  • 0, start
    ベンチマークを開始する
  • 1, stop
    ベンチマークを終了する

ログの表示形式

負荷が 1 を超えるとかなり重たい部類になる。

  • t
    前のログからの時間差
  • avg
    平均負荷
  • max
    最大負荷
  • min
    最小負荷

CIE 色度図を表示する ciescope

$
0
0

CIE 色度図を表示する ciescope の使い方。出力フォーマットは rgba64le なので余白部分をオーバーレイで透過できる。

基本コマンド

ffplay input -vf ciescope=system=0:cie=0:gamuts=ntsc:s=512:i=.001:contrast=.75:corrgamma=1:showwhite=0:gamma=2.6
ffplay input -vf ciescope=0:0:ntsc:512:.001:.75:1:0:2.6

ciescope のサンプル画像


公式ドキュメント:FFmpeg Filters Documentation :: ciescope

オプション

  • system
    カラーシステムの指定
    規定値:0[int]
    • 0, ntsc, 470m。規定値
    • 1, ebu, 470bg
    • 2, smpte
    • 3, 240m
    • 4, apple
    • 5, widergb
    • 6, cie1931
    • 7, rec709, hdtv
    • 8, uhdtv, rec2020
  • cie
    CIE システムの指定
    規定値:0[int]
    • 0, xyy。規定値
    • 1, ucs
    • 2, luv
  • gamuts
    境界線を引く。system と同じオプションが指定できる
    規定値:0[flags]
  • size, s
    出力解像度の指定
    範囲:256 – 8192[int]
    規定値:512
  • intensity, i
    描写の加減指定
    範囲:0.001 – 1[float]
    規定値:0.001
  • contrast
    コントラストの指定
    範囲:0 – 1[float]
    規定値:0.75
  • corrgamma
    スコープ部分のガンマ補正の指定
    範囲:0 – 1[boolean]
    規定値:1
  • showwhite
    ICE ダイアグラムの中心に + を描写する
    範囲:0 – 1[boolean]
    規定値:0
  • gamma
    入力ガンマ値の指定。xyy を指定しているときに使える
    範囲:0.1 – 6[double]
    規定値:2.6

手動でフィールド処理を行う fieldhint

$
0
0

フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速にプログレッシブ化できる fieldhint の使い方。いわゆる手動インターレース解除フィルタである。間引くフレームも分かるので decimate ではなく trim を使うことでより正確に処理ができる。フィールドを選択できるのが fieldhint でフレームを選択するのが select。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。

基本コマンド

単純なプログレッシブ化
ffmpeg -i input -vf fieldhint=hint.txt:relative output
ntsc 29.976 フレームの動画を trim を併用して5フレーム中2フレーム目を間引く例(n は 0 スタート)。trim で間引く場合は fps で正しいフレームレートを指定しないと再び重複フレームが作られる
ffmpeg -i input -vf fieldhint=hint.txt:relative,select=(mod(n-1\,5)),fps=24000/1001 output

trim フィルタの使い方
ffmpeg で使える計算書式

公式ドキュメント:FFmpeg Filters Documentation :: fieldhint

オプション

  • hint
    フィールド指定ファイルを指定する
    規定値はないので必ず指定する
  • mode
    フィールド指定ファイルのフレーム番号の指定方法
    規定値:absolute
    0 から 1[int]
    • 0, absolute
      絶対フレーム番号指定。規定値
      現在フレーム番号から前後1フレーム
    • relative
      相対フレーム番号指定
      -1 から 1[int]

hintファイルの書き方

出力フレーム数が hintファイルのフレーム数に収まっていないとエラーになるので余裕を持って記入しておく。フィールド指定の後に +, - を指定することで + ならインターレス、- ならプログレッシブのフラグを立てることがつける必要は無い。また #, ; でコメントを記入できる。規定値は absolute だが hintファイルは relative のほうが書きやすい。

relative 向けの hintファイルの例

0,0 # 1番フレーム, 1番フレームのトップフィールドと1番フレームのボトムフィールドを合わせて1フレームにする
0,0 # 2番フレーム, 2番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
0,-1 # 3番フレーム, 3番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
0,-1 # 4番フレーム, 4番フレームのトップフィールドと3番フレームのボトムフィールドを合わせて1フレームにする
0,0

absolute 向けの hintファイルの例

0,0 # 1番フレーム, 1番フレームのトップフィールドと1番フレームのボトムフィールドを合わせて1フレームにする
1,1 # 2番フレーム, 2番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
2,1 # 3番フレーム, 3番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
3,2 # 4番フレーム, 4番フレームのトップフィールドと3番フレームのボトムフィールドを合わせて1フレームにする
4,4

フィルタの効果を調べる方法

最初にフレーム番号は1から始まるが、映像に表示される数字は0から始まるのをよく覚えておく。drawtext のフレーム番号は 0 スタートなのでプラス1がフレーム数になる。

0から71までの数字(左上)72フレームを記載した3秒のテスト動画
ffmpeg -f lavfi -i color=white:s=200x200:r=24000/1001:d=3,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=64" -vcodec utvideo sample.mkv

さらにテレシネして0から89までの数字(右下)90フレームを記載したトップフィールドファーストの動画
ffmpeg -i sample.mkv -vf telecine,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=W-tw:y=H-th" -vcodec utvideo telecine.mkv

トップフィールドを調べるには field=0、ボトムフォールドを調べるには field=1 を使う
ffmpeg -i telecine.mkv -vf field=0 -vcodec utvideo top.mkv

するとこのような元のフレーム番号が出力される(10の位は省略)

num   :1234567890123
top     :0112345567899
bottom:0123345677890

それをこのように書き換える

num   :1234567890123
top     :0112345567899
bottom:0112345567899

relative 向けの hintファイルの例を使ってプログレッシブにして左下にフレーム番号をつけた動画
ffmpeg -i telecine.mkv -vf fieldhint=23pulldown.csv:relative,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=0:y=H-th" -vcodec utvideo fieldhint-23pulldown.mkv

23pulldown.csv

0,0
0,0
0,-1
0,-1
0,0
;以下ループ

次に 2, 3, 7, 8 番目のフレームが重複しているので 2, 7 番目のフレームを trim で間引く。動画出力する場合は fps でフレーム数を間引いた後の値を指定する。
ffmpeg -i telecine.mkv -vf fieldhint=23pulldown.csv:relative,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=0:y=H-th",select=(mod(n-1\,5)),fps=24000/1001 -y -vcodec utvideo select-mod-n-1.mkv

重複フレームと trim の関係

あるのかどうかは知らないが間引く最初の1フレームだけインターレースの場合は、片フィールドしかないのでフィールドをずらさずに先にカット trim=start_frame=1。ffmpeg のログ出力は 0フレームスタートだが、1フレームスタートの方が感覚的にわかりやすい。映像がすでにプログレッシブで重複フレームがある場合は、間引くフレームの該当フレームを調べる

0フレームスタート

ボトムフィールド 縞フレーム trimコマンド 間引くフレーム
00-1-1000-1-10 2378 (mod(n-1\,5)) 16 23プルダウン
0-1-1000-1-100 1267 (mod(n\,5)) 05 32プルダウン
-1-1000-1-1000 0156 (mod(n-4\,5)) 49
04590 (mod(n-3\,5)) 38
000-1-1000-1-1 3489 (mod(n-2\,5)) 27

1フレームスタート

ボトムフィールド 縞フレーム trimコマンド 間引くフレーム
00-1-1000-1-10 3489 (mod(n-1\,5)) 27 23プルダウン
0-1-1000-1-100 2378 (mod(n\,5)) 16 32プルダウン
-1-1000-1-1000 1267 (mod(n-4\,5)) 50
1560 (mod(n-3\,5)) 49
000-1-1000-1-1 4590 (mod(n-2\,5)) 38
Viewing all 311 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>