kobapan@wiLiki
Login
Linux

Linux:ffmpeg

目次

音だけ取り出す

対象の動画ファイルの音声コーデックを確認

 ffmpeg -i input.flv
 

音だけ取り出す

 ffmpeg -i 'in.flv' -vn -acodec copy out.aac

vn は動画部分を無効化するオプション

acodec copy 音声を無劣化でコピー

音を消す

 ffmpeg -i 入力動画 -vcodec copy -an 出力動画

an オーディオを disable にするオプション

一枚の画像に音を付けて動画にする

 ffmpeg -loop 1 -i sample.jpg -i sample.mp3 -pix_fmt yuv420p -shortest output.mp4

loop 1 静止画を繰り返す

shortest 入力の短い方(音声)に動画時間を合わす

以上のことを応用して、別の映像の音声とすり替える

ビデオ用の映像から音を消す

 ffmpeg -i Video.mp4 -an NoAudio.mp4

音声用の映像から音を取り出す

 ffmpeg -i Audio.mp4 -vn -acodec copy Audio.aac
 

ビデオと音声を結合する

 ffmpeg -i NoAudio.mp4 -i Audio.aac -shortest out.mp4

コントラスト、明るさ(輝度)、サチュレーションを調整する

例)明るさ(brightness,輝度) 0.1、彩度(saturation)1.5、コントラスト(contrast)1.5 に設定する

 ffmpeg -i in.mp4  -vf eq=brightness=0.1:saturation=1.5:contrast=1.5 out.mp4

例)彩度(saturation)1.5 に設定する

 ffmpeg -i in.mp4  -vf eq=saturation=1.5 out.mp4

contrast の値は -2.0 to 2.0 の範囲。 デフォルト値は 1

brightness の値は -1.0 to 1.0 の範囲。 デフォルト値は 0

saturation の値は 0.0 to 3.0 の範囲。 デフォルト値は 1

動画の一部分を切り抜く(指定時間でトリミング)

書式

 ffmpeg -ss 開始時間(秒) -i in.mp4 -t トリミングしたい長さ(秒) out.mp4

--ssは-i より前に書くのが吉

例)動画を10秒目から5秒間トリミングする

 # 再エンコードあり
 ffmpeg -ss 10 -i in.mp4 -t 5 out.mp4
 # 再エンコードなし
 ffmpeg -ss 10 -i in.mp4 -t 5 -vcodec copy out.mp4

動画の最初からの場合 -ss はいらない

動画の最後までの場合 -t はいらない

0.00秒まで指定できる

音声ファイルの一部分を切り抜く(指定時間でトリミング)

先頭を切り取る

 ffmpeg -i in.mp3 -t 3600 out.mp3

inmp3の、0秒~3600秒までを切り取る

途中を切り取る

 ffmpeg -i in.mp3 -ss 60 -t 3540 out.mp3

in.mp3の、60秒~3600秒までを切り取る

末尾を切り取る

 ffmpeg -i in.mp3 -ss 60 out.mp3

in.mp3の、60秒~最後までを切り取る

聞き取りやすい音量に変える

正規化する

大きすぎる音は小さく、小さすぎる音は大きく聞き取りやすい音量に変える。

 ffmpeg -i input -af dynaudnorm output

10dB上げる

 ffmpeg -i input -af volume=10dB output

10dB下げる

 ffmpeg -i input -af volume=-10dB output

音量の統計を調べる

 ffmpeg -i input -af volumedetect -vn -f null -

指定時間の音量を変える

50秒-60秒の音量を下げる例

ファイルを分割

 ffmpeg -i in.mp4 -t 50 -vcodec copy before.mp4
 ffmpeg -ss 50 -i in.mp4 -t 10 -vcodec copy target.mp4
 ffmpeg -ss 60 -i in.mp4 -vcodec copy after.mp4

第2ファイルのボリュームを下げる

 ffmpeg -i target.mp4 -af volume=-20dB -vcodec copy vdown.mp4

ファイルを結合

 echo "file before.mp4" > list.txt
 echo "file vdown.mp4" >> list.txt
 echo "file after.mp4" >> list.txt
 ffmpeg -f concat -i list.txt -c copy out.mp4

再圧縮をしない

ffmpeg は何もオプションを指定しないと再圧縮を行う。再圧縮を行わずに元々のストリームをコピーしたい場合、

-vcodec copy # force video codec ('copy' to copy stream)

-acodec copy # force audio codec ('copy' to copy stream)

-c copy # force codec ('copy' to copy stream)

縦横比を維持したまま、動画サイズを変える

元の動画の解像度を調べる

 ffprobe -hide_banner in.mp4

オプション -hide_banner : do not show program banner

Stream #0:0(eng): Video: の行の、 640x480, というのが解像度(横x縦)

横640指定で、縦は自動

 ffmpeg -i in.mp4 -vf scale=640:-1 out.mp4

縦720指定で、横は自動

 ffmpeg -i in.mp4 -vf scale=-1:720 out.mp4

オプション -vf filter_graph : set video filters

16:9の代表的解像度 | 8K | 7680x4320 | | 4K | 3840x2160 | | WQHD | 2560x1440 | | FHD | 1920x1080 | | WXGA++ | 1600x900 | | HD | 1280x720 | | | 1024x576 | | | 768x432 | | | 640x360 | | | 480x270 | | | 320x180 | | | 160x90 |

再生速度を変える

2倍速の場合(早送り)

 ffmpeg -i in.mp4 -vf setpts=PTS/2.0 -af atempo=2.0 out.mp4

0.8倍速の場合(スロー再生)

 ffmpeg -i in.mp4 -vf setpts=PTS/0.8 -af atempo=0.8 out.mp4

画像と動画の連結

画像をタイムラプス動画にしておいて、動画同士を連結

画像が沢山ある場合

 ffmpeg -framerate 30 -i %03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 img.mp4

-framerate 30'' 1秒間に違う画像が30枚

-r 60'' framerateと同じだが、出力ファイル用に違う表現を使うのが吉。同じ画像を2度表示することで、1秒間に60枚表示

これで連番画像が image_001.png ~ image_120.png で120枚だった場合、4秒の動画

連番が1から始まらないとエラーが出る

画像が1枚の場合

 ffmpeg -framerate 1 -i in.png -vcodec libx264 -pix_fmt yuv420p -s 320x180 -r 120 img.mp4

-framerate 1'' 1秒間に使う画像は1枚

-r 60'' 1秒間に同じ画像を60回表示する

-s'' 動画サイズを320x180にする

画像が2枚の場合

 ffmpeg -framerate 1 -i in%d.png -vcodec libx264 -pix_fmt yuv420p -s 320x180 -r 120 img.mp4

-i in%d.png'' in1.png と in2.png

in1.png と in2.png が同じ画像の名前違いなら、静止動画が2秒になる

連結

 echo "file img.mp4" > list.txt
 echo "file in.mp4" >> list.txt
 ffmpeg -f concat -i list.txt -c copy out.mp4

動画から連番の静止画を切り出す

1秒間を30枚に切り出す

 ffmpeg -i in.mp4 -r 30 image_%02d.png

1秒間を1枚に切り出す

 ffmpeg -i in-src.mp4 -r 1 image_%02d.png

image_01.png ... が出来る

動画ファイルを結合

echo "file 1.mp4" > list.txt echo "file 2.mp4" >> list.txt echo "file 3.mp4" >> list.txt echo "file 4.mp4" >> list.txt

ffmpeg -f concat -i list.txt -c copy out.mp4

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...