438 lines
18 KiB
Markdown
438 lines
18 KiB
Markdown
|
---
|
|||
|
title: ffmpeg
|
|||
|
private: false
|
|||
|
date: '21:17 28-10-2018'
|
|||
|
---
|
|||
|
|
|||
|
<style>
|
|||
|
h3 {
|
|||
|
font-family : 'Roboto Condensed', Helvetica, sans-serif;
|
|||
|
font-weight : 300;
|
|||
|
font-size : 21px;
|
|||
|
}
|
|||
|
a img {
|
|||
|
border : 0px;
|
|||
|
cursor : pointer;
|
|||
|
}
|
|||
|
.img {
|
|||
|
border : 0px;
|
|||
|
cursor : pointer;
|
|||
|
max-height: 30%;
|
|||
|
}
|
|||
|
|
|||
|
img {
|
|||
|
border : 0px;
|
|||
|
cursor : pointer;
|
|||
|
max-height: 30%;
|
|||
|
}
|
|||
|
|
|||
|
h1 {
|
|||
|
margin : 8px 0 0 0;
|
|||
|
background: #00b6de;
|
|||
|
font-family : 'Roboto Condensed', Helvetica, sans-serif;
|
|||
|
font-weight : 400;
|
|||
|
font-size : 58px;
|
|||
|
margin: 0 0 16px 0;
|
|||
|
padding: 5px 15px;
|
|||
|
color: #ffffff;
|
|||
|
line-height: 1em;
|
|||
|
}
|
|||
|
|
|||
|
h2 {
|
|||
|
margin-left : auto;
|
|||
|
margin-right : auto;
|
|||
|
padding: 5px 15px;
|
|||
|
font-size : 22px;
|
|||
|
font-weight : 400;
|
|||
|
line-height : 1em;
|
|||
|
background: #E9A805;
|
|||
|
}
|
|||
|
|
|||
|
.blue {
|
|||
|
background: #00b6de;
|
|||
|
}
|
|||
|
|
|||
|
</style>
|
|||
|
<!-- https://kwizzu.com/construct.html -->
|
|||
|
|
|||
|
FFmpeg aide
|
|||
|
|
|||
|
[TOC]
|
|||
|
|
|||
|
# Trics
|
|||
|
|
|||
|
> Original article : https://lukaprincic.si/development-log/ffmpeg-audio-visualization-tricks
|
|||
|
|
|||
|
## Audio Vector Scope
|
|||
|
<video class="wp-video-shortcode" id="video-4605-7_html5" preload="metadata" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_pad.mp4?_=7"></video>
|
|||
|
|
|||
|
```
|
|||
|
ffmpeg -i INPUT_AUDIO.wav -filter_complex "[0:a]avectorscope=s=480x480:zoom=1.5:rc=0:gc=200:bc=0:rf=0:gf=40:bf=0,format=yuv420p[v]; [v]pad=854:480:187:0[out]" -map "[out]" -map 0:a -b:v 700k -b:a 360k OUTPUT_VIDEO.mp4
|
|||
|
```
|
|||
|
|
|||
|
The code above creates a mp4 video file with a vectorscope nicely centered inside a 854×480 (480p) video. If you need a 1:1 video, just exclude the pad part:
|
|||
|
|
|||
|
```
|
|||
|
ffmpeg -i INPUT_AUDIO.wav -filter_complex "[0:a]avectorscope=s=480x480:zoom=1.5:rc=0:gc=200:bc=0:rf=0:gf=40:bf=0,format=yuv420p[v]" -map "[v]" -map 0:a -b:v 700k -b:a 360k OUTPUT_VIDEO.mp4
|
|||
|
```
|
|||
|
|
|||
|
Documentation on ‘avectorscope’ filter is here: https://ffmpeg.org/ffmpeg-filters.html#avectorscope. One can play with zoom and other options to produce desired form.
|
|||
|
|
|||
|
## Show waves
|
|||
|
<video class="wp-video-shortcode" id="video-4605-8_html5" preload="metadata" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_showwaves-1.mp4?_=8" wheight="50%" ><source type="video/mp4" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_showwaves-1.mp4?_=8"></video>
|
|||
|
|
|||
|
```
|
|||
|
ffmpeg -i INPUT.wav -filter_complex "[0:a]showwaves=mode=line:s=hd480:colors=White[v]" -map "[v]" -map 0:a -pix_fmt yuv420p -b:a 360k -r:a 44100 OUTPUT.mp4
|
|||
|
```
|
|||
|
more options: http://www.ffmpeg.org/ffmpeg-filters.html#showwaves
|
|||
|
|
|||
|
## Showspectrum
|
|||
|
<video class="wp-video-shortcode" id="video-4605-9_html5" preload="metadata" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_spectrum.mp4?_=9" ><source type="video/mp4" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_spectrum.mp4?_=9"><a href="http://lukaprincic.si/wp-content/uploads/2017/09/standing_spectrum.mp4">http://lukaprincic.si/wp-content/uploads/2017/09/standing_spectrum.mp4</a></video>
|
|||
|
```
|
|||
|
ffmpeg -i INPUT.wav -filter_complex "[0:a]showspectrum=s=854x480:mode=combined:slide=scroll:saturation=0.2:scale=log,format=yuv420p[v]" -map "[v]" -map 0:a -b:v 700k -b:a 360k OUTPUT.mp4
|
|||
|
```
|
|||
|
|
|||
|
Above code will create almost completely desaturated spectrum of the audio sliding from right to left. Again, there are various options to tweak, see here: https://ffmpeg.org/ffmpeg-filters.html#showspectrum-1
|
|||
|
|
|||
|
|
|||
|
## Histogram
|
|||
|
<video class="wp-video-shortcode" id="video-4605-10_html5" preload="metadata" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_histogram.mp4?_=10" ><source type="video/mp4" src="http://lukaprincic.si/wp-content/uploads/2017/09/standing_histogram.mp4?_=10"><a href="http://lukaprincic.si/wp-content/uploads/2017/09/standing_histogram.mp4">http://lukaprincic.si/wp-content/uploads/2017/09/standing_histogram.mp4</a></video>
|
|||
|
|
|||
|
```
|
|||
|
ffmpeg -i INPUT.wav -filter_complex "[0:a]ahistogram=s=hd480:slide=scroll:scale=log,format=yuv420p[v]" -map "[v]" -map 0:a -b:a 360k OUTPUT.mp4
|
|||
|
```
|
|||
|
more options: http://www.ffmpeg.org/ffmpeg-filters.html#showwaves
|
|||
|
|
|||
|
## Static spectrogram
|
|||
|
Sometimes you want to just create a static image.
|
|||
|
|
|||
|
### create a spectrogram as a single frame
|
|||
|
```
|
|||
|
ffmpeg -i INPUT.wav -lavfi
|
|||
|
showspectrumpic=s=hd480:legend=0,format=yuv420p
|
|||
|
SPECTROGRAM.png
|
|||
|
```
|
|||
|
### add png to audio - you need to know the length of audio
|
|||
|
```
|
|||
|
ffmpeg -loop 1 -i SPECTROGRAM.png -i INPUT.wav
|
|||
|
-s hd480 -t 00:01:00 -pix_fmt yuv420p
|
|||
|
-b:a 360k -r:a 44100 OUTPUT.mp4
|
|||
|
```
|
|||
|
|
|||
|
### create a spectrogram as a single frame
|
|||
|
```
|
|||
|
ffmpeg -i INPUT.wav -lavfi
|
|||
|
showspectrumpic=s=hd480:legend=0,format=yuv420p
|
|||
|
SPECTROGRAM.png
|
|||
|
```
|
|||
|
### add png to audio - you need to know the length of audio
|
|||
|
```
|
|||
|
ffmpeg -loop 1 -i SPECTROGRAM.png -i INPUT.wav
|
|||
|
-s hd480 -t 00:01:00 -pix_fmt yuv420p
|
|||
|
-b:a 360k -r:a 44100 OUTPUT.mp4
|
|||
|
```
|
|||
|
|
|||
|
Above one is in two steps. More info here: http://www.ffmpeg.org/ffmpeg-filters.html#showspectrumpic
|
|||
|
|
|||
|
|
|||
|
## text overlays
|
|||
|
|
|||
|
```
|
|||
|
ffmpeg \
|
|||
|
-i video1.mp4 -i video2.mp4
|
|||
|
-filter_complex "[0:v:0] [0:a:0] [0:v:1] [0:a:1] concat=n=2:v=1:a=1 [v][a];
|
|||
|
[v]drawtext=text='SOME TEXT':x=(w-text_w):y=(h-text_h):fontfile=OpenSans.ttf:fontsize=30:fontcolor=white[v]" \
|
|||
|
-map "[v]" -map "[a]" -deinterlace \
|
|||
|
-vcodec libx264 -pix_fmt yuv420p -preset $QUAL -r $FPS -g $(($FPS * 2)) -b:v $VBR \
|
|||
|
-acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b:a 712000 -bufsize 512k \
|
|||
|
-f flv "$YOUTUBE_URL/$KEY"
|
|||
|
```
|
|||
|
|
|||
|
## Print file metadata etc.
|
|||
|
ffmpeg -i path/to/file.ext
|
|||
|
|
|||
|
# Convertion
|
|||
|
|
|||
|
## Convert all m4a files to mp3
|
|||
|
for f in *.m4a; do ffmpeg -i "$f" -acodec libmp3lame -vn -b:a 320k "${f%.m4a}.mp3"; done
|
|||
|
|
|||
|
## Convert video from .foo to .bar
|
|||
|
-g : GOP, for searchability
|
|||
|
```
|
|||
|
ffmpeg -i input.foo -vcodec bar -acodec baz -b:v 21000k -b:a 320k -g 150 -threads 4 output.bar
|
|||
|
```
|
|||
|
|
|||
|
## Convert image sequence to video
|
|||
|
ffmpeg -r 18 -pattern_type glob -i '*.png' -b:v 21000k -s hd1080 -vcodec vp9 -an -pix_fmt yuv420p -deinterlace output.ext
|
|||
|
|
|||
|
|
|||
|
## Listen to 10 seconds of audio from a video file
|
|||
|
-ss : start time / -t : seconds to cut / -autoexit : closes ffplay as soon as the audio finishes
|
|||
|
```
|
|||
|
ffmpeg -ss 00:34:24.85 -t 10 -i path/to/file.mp4 -f mp3 pipe:play | ffplay -i pipe:play -autoexit
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
# Common switches
|
|||
|
|
|||
|
```bash
|
|||
|
-codecs # list codecs
|
|||
|
-c:v # video codec (-vcodec) - 'copy' to copy stream
|
|||
|
-c:a # audio codec (-acodec)
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
-fs SIZE # limit file size (bytes)
|
|||
|
```
|
|||
|
|
|||
|
## Bitrate
|
|||
|
|
|||
|
```bash
|
|||
|
-b:v 1M # video bitrate (1M = 1Mbit/s)
|
|||
|
-b:a 1M # audio bitrate
|
|||
|
```
|
|||
|
|
|||
|
## Video
|
|||
|
|
|||
|
```bash
|
|||
|
-aspect RATIO # aspect ratio (4:3, 16:9, or 1.25)
|
|||
|
-r RATE # frame rate per sec
|
|||
|
-s WIDTHxHEIGHT # frame size
|
|||
|
-vn # no video
|
|||
|
```
|
|||
|
|
|||
|
## Audio
|
|||
|
|
|||
|
```bash
|
|||
|
-aq QUALITY # audio quality (codec-specific)
|
|||
|
-ar 44100 # audio sample rate (hz)
|
|||
|
-ac 1 # audio channels (1=mono, 2=stereo)
|
|||
|
-an # no audio
|
|||
|
-vol N # volume (256=normal)
|
|||
|
```
|
|||
|
|
|||
|
### Example
|
|||
|
|
|||
|
|
|||
|
## ffmpeg generate overlay complex filter for audio with background image
|
|||
|
```bash
|
|||
|
ffmpeg -y -i input.mp3 -loop 1 -i background.png \
|
|||
|
-filter_complex "[0:a]showwaves=s=1280x720:mode=line,colorkey=0x000000:0.01:0.1,format=yuva420p[v];[1:v][v]overlay[outv]" \
|
|||
|
-map "[outv]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a copy -shortest output.mp
|
|||
|
```
|
|||
|
|
|||
|
[https://www.youtube.com/watch?v=zKYzJ_bEJVo](https://www.youtube.com/watch?v=zKYzJ_bEJVo)
|
|||
|
```bash
|
|||
|
ffmpeg -y -i audio.mp3 -loop 1 -i image.jpg \
|
|||
|
-filter_complex "[0:a]showwaves=s=1280x175:colors=Yellow:mode=line,format=yuv420p[v];[1:v][v]overlay=0:200[outv]" \
|
|||
|
-map "[outv]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a copy -shortest output9.mp4
|
|||
|
```
|
|||
|
|
|||
|
[https://www.youtube.com/watch?v=1htjI7YSNZo](https://www.youtube.com/watch?v=1htjI7YSNZo)
|
|||
|
```bash
|
|||
|
ffmpeg -y -i audio.mp3 -loop 1 -i image.jpg \
|
|||
|
-filter_complex "[0:a]showwaves=s=1280x720:mode=line,colorkey=0x000000:0.01:0.1,format=yuva420p[v];[1:v][v]overlay[outv]" \
|
|||
|
-map "[outv]" -pix_fmt yuv420p -map 0:a -c:v libx264 -c:a copy -shortest output1.mp4
|
|||
|
```
|
|||
|
[https://www.youtube.com/watch?v=H5dCKuN9Ius](https://www.youtube.com/watch?v=H5dCKuN9Ius)
|
|||
|
```
|
|||
|
ffmpeg -y -i audio.mp3 -loop 1 -i image.jpg \
|
|||
|
-filter_complex "[0:a]showwaves=s=1280x175:colors=White:mode=p2p,format=yuv420p[v];[1:v][v]overlay=0:200[outv]" \
|
|||
|
-map "[outv]" -pix_fmt yuv420p \
|
|||
|
-map 0:a -c:v libx264 -c:a copy -shortest output12.mp4
|
|||
|
```
|
|||
|
|
|||
|
# Fancy Filtering Examples
|
|||
|
https://trac.ffmpeg.org/wiki/FancyFilteringExamples
|
|||
|
|
|||
|
## cellauto
|
|||
|
<a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/cellauto.png" style="padding:0; border:none"><img alt="cellauto image" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/cellauto.png" title="cellauto image" /></a>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i cellauto=rule=110
|
|||
|
```
|
|||
|
|
|||
|
<p>Other interesting cellauto rule values: 9, 18, 22, 26, 30, 41, 45, 50, 54, 60, 62, 73, 75, 77, 82, 86, 89, 90, 97, 99, 101, 102, 105, 107, 109, <a class="ext-link" href="http://en.wikipedia.org/wiki/Rule_110"><span class="icon"></span>110</a> (default), 124, 126, 129, 131, 133, 135, 137, 145, 146, 149, 150, 151, 153, 154, 161, 167, 169, 181, 182, 183, 193, 195, 210, 218, 225.</p>
|
|||
|
|
|||
|
<h3 id="life">life</h3>
|
|||
|
|
|||
|
<a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/life.png" style="padding:0; border:none"><img alt="life image" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/life.png" title="life image" /></a>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16
|
|||
|
```
|
|||
|
|
|||
|
<a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/life2.png" style="padding:0; border:none"><img alt="Second example for life filter (blue & blur)" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/life2.png" title="Second example for life filter (blue & blur)" /></a>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i life=s=640x480:mold=10:r=100:ratio=0.1:death_color=blue:life_color=#00ff00,boxblur=2:2
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="mandelbrot">mandelbrot</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/mandelbrot.png" style="padding:0; border:none"><img alt="mandelbrot image" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/mandelbrot.png" title="mandelbrot image" /></a></p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i mandelbrot
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="mirroreffect">mirror effect</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/ffplay-mirror.jpg" style="padding:0; border:none"><img alt="Mirror effect with lavfi" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/ffplay-mirror.jpg" title="Mirror effect with lavfi" /></a></p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -i INPUT -vf "crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="videochannelseparationeffectwithlutfilter">video channel separation effect with lut filter</h3>
|
|||
|
|
|||
|
<p>RGB version <a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/rgb_sep.jpg" style="padding:0; border:none"><img alt="original image plus images of the separations of the R, G, and B channels" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/rgb_sep.jpg" title="original image plus images of the separations of the R, G, and B channels" /></a></p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i testsrc -vf "split=4[a][b][c][d];[b]lutrgb=g=0:b=0[x];[c]lutrgb=r=0:b=0[y];[d]lutrgb=r=0:g=0[z];[a][x][y][z]hstack=4"
|
|||
|
```
|
|||
|
|
|||
|
<p>YUV version <a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/yuv_sep.jpg" style="padding:0; border:none"><img alt="original image plus images of the separations of the Y, U, and V channels" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/yuv_sep.jpg" title="original image plus images of the separations of the Y, U, and V channels" /></a></p>
|
|||
|
|
|||
|
```
|
|||
|
ffplay -f lavfi -i testsrc -vf "split=4[a][b][c][d];[b]lutyuv=u=128:v=128[x];[c]lutyuv=y=0:v=128[y];[d]lutyuv=y=0:u=128[z];[a][x][y][z]hstack=4"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="histogramwaveform">histogram & waveform</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/histograms.png" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/histograms.png" /></a></p>
|
|||
|
|
|||
|
<pre class="wiki">
|
|||
|
ffplay -f lavfi -i mandelbrot -vf "format=gbrp,split=4[a][b][c][d],[d]histogram=display_mode=0:level_height=244[dd],[a]waveform=m=1:d=0:r=0:c=7[aa],[b]waveform=m=0:d=0:r=0:c=7[bb],[c][aa]vstack[V],[bb][dd]vstack[V2],[V][V2]hstack"
|
|||
|
</pre>
|
|||
|
|
|||
|
<h3 id="vectorscopewaveforms">vectorscope & waveforms</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/waveforms_vectorscope.png" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/waveforms_vectorscope.png" /></a></p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i mandelbrot -vf "format=yuv444p,split=4[a][b][c][d],[a]waveform[aa],[b][aa]vstack[V],[c]waveform=m=0[cc],[d]vectorscope=color4[dd],[cc][dd]vstack[V2],[V][V2]hstack"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="waveform">waveform</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/waveform.jpg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/waveform.jpg" /></a></p>
|
|||
|
|
|||
|
<p>Split the waveform filter to show broadcast range of the waveform (y values between 16 and 235) in green and out of broadcast range in red.</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -i http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi -vf "split[a][b];[a]format=gray,waveform,split[c][d];[b]pad=iw:ih+256[padded];[c]geq=g=1:b=1[red];[d]geq=r=1:b=1,crop=in_w:220:0:16[mid];[red][mid]overlay=0:16[wave];[padded][wave]overlay=0:H-h"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="waveformwithenvelope">waveform with envelope</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/waveforme.png" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/waveforme.png" /></a></p>
|
|||
|
|
|||
|
<p>Split the waveform filter to show broadcast range of the waveform (y values between 16 and 235) in green and out of broadcast range in red and also use envelope.</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay ~/matrixbench_mpeg2.mpg -vf "split[a][b];[a]waveform=e=3,split=3[c][d][e];[e]crop=in_w:20:0:235,lutyuv=v=180[low];[c]crop=in_w:16:0:0,lutyuv=y=val:v=180[high];[d]crop=in_w:220:0:16,lutyuv=v=110[mid] ; [b][high][mid][low]vstack=4"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="morewaveformsandvectorscope">more waveforms and vectorscope</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/wfmg.jpg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/wfmg.jpg" /></a> <a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/wfmgc.jpg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/wfmgc.jpg" /></a></p>
|
|||
|
|
|||
|
<h3 id="datascope">datascope</h3>
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/datascope.jpg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/datascope.jpg" /></a></p>
|
|||
|
|
|||
|
# Audio
|
|||
|
|
|||
|
## Combine video and audio into 1 file
|
|||
|
ffmpeg -i video.ext -i audio.ext -c:v copy -c:a copy output.ext
|
|||
|
|
|||
|
<h3 id="aevalsrc">aevalsrc</h3>
|
|||
|
|
|||
|
Making some random "musical" keys:
|
|||
|
|
|||
|
```bash
|
|||
|
% cat expr
|
|||
|
# floor(t): 0 0 0 0 0 ... 1 1 1 1 1 ... 2 2 2 2 2
|
|||
|
# => set a random key when floor(t) changes
|
|||
|
if(eq(floor(t),ld(2)),
|
|||
|
st(0,random(4)*3000+1000));
|
|||
|
|
|||
|
# the next value to compare floor(t) with
|
|||
|
st(2,floor(t)+1);
|
|||
|
|
|||
|
# mod(t,1) makes t always in the range [0;1) for each key
|
|||
|
st(1,mod(t,1));
|
|||
|
|
|||
|
# 0.6*... + 0.4*... for "echo" effect
|
|||
|
# exp() to mitigate the sound according to the time
|
|||
|
(0.6*sin(1*ld(0)*ld(1))+
|
|||
|
0.4*sin(2*ld(0)*ld(1)))*exp(-4*ld(1))
|
|||
|
```
|
|||
|
|
|||
|
And to test it:
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi -i "aevalsrc=$(grep -v '^#' expr|tr -d '\n'|sed 's/\([,;]\)/\\\1/g')"
|
|||
|
```
|
|||
|
|
|||
|
<h3 id="showwavesandshowspectrum">showwaves and showspectrum</h3>
|
|||
|
|
|||
|
<p>Given the audio file april.flac:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi 'amovie=april.flac,asplit=3[out1][a][b]; [a]showwaves=s=640x240[waves]; [b]showspectrum=s=640x240[spectrum]; [waves][spectrum] vstack[out0]'
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/ffplay-waves-spectrum.png" style="padding:0; border:none"><img alt="FFplay with showwaves and showspectrum" src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/ffplay-waves-spectrum.png" title="FFplay with showwaves and showspectrum" /></a></p>
|
|||
|
|
|||
|
<h3 id="showspectrum">showspectrum</h3>
|
|||
|
|
|||
|
<p>Given the multichannel audio file tearsofsteel-surround.flac:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi 'amovie=tearsofsteel-surround.flac,asplit=2[out1][a]; [a]showspectrum=color=channel:scale=cbrt:orientation=vertical:overlap=1:s=2048x1024[out0]'
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/mcspectrum.jpeg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/mcspectrum.jpeg" /></a></p>
|
|||
|
|
|||
|
<p>Now with different colors and scaling:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi 'amovie=tearsofsteel-surround.flac,asplit=2[out1][a]; [a]showspectrum=color=fire:scale=log:orientation=vertical:overlap=1:s=1024x1024[out0]'
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/firespectrum.jpeg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/firespectrum.jpeg" /></a></p>
|
|||
|
|
|||
|
<h3 id="avectorscope">avectorscope</h3>
|
|||
|
|
|||
|
<p>Given the audio file input.flac:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi 'amovie=input.flac,asplit=2[out1][a],[a]avectorscope=m=polar:s=800x400[out0]'
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/polar_avectorscope.png" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/polar_avectorscope.png" /></a></p>
|
|||
|
|
|||
|
<h3 id="showcqt">showcqt</h3>
|
|||
|
|
|||
|
<p>Given the audio file input.flac:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffplay -f lavfi 'amovie=input.flac,asplit=2[out1][a],[a]showcqt[out0]'
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/showcqt.png" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/showcqt.png" /></a></p>
|
|||
|
|
|||
|
<h3 id="showspectrumpic">showspectrumpic</h3>
|
|||
|
|
|||
|
<p>Given the audio file input.flac:</p>
|
|||
|
|
|||
|
```bash
|
|||
|
ffmpeg -i input.flac -lavfi showspectrumpic=s=hd720 out.jpg
|
|||
|
```
|
|||
|
|
|||
|
<p><a href="https://trac.ffmpeg.org/attachment/wiki/FancyFilteringExamples/showspectrumpic.jpg" style="padding:0; border:none"><img src="https://trac.ffmpeg.org/raw-attachment/wiki/FancyFilteringExamples/showspectrumpic.jpg" /></a></p>
|
|||
|
</div>
|
|||
|
|
|||
|
|