Compare commits

...

47 Commits

Author SHA1 Message Date
Katherine Frances Nagels
839d50111e Merge pull request #393 from amiaopensource/kn/remove-unnecessary-command
Remove MKV → MP4 command
2019-08-01 07:32:51 +12:00
Reto Kromer
a6dd9c203c update recipe list 2019-07-31 16:50:39 +02:00
kfrn
3402d968a7 Remove MKV → MP4 command
Addressing user feedback received by Andrew Weaver (@privatezero).

When the source file is ffv1 in MKV, the command will fail on the `-c:v copy` flag, since MP4s can't house ffv1.
Therefore, the command is misleading, and has limited value from an archival perspective.

We already have a basic rewrap command (which includes a note addressing the possibility of stream/wrapper incompability), so I think our bases are covered with that.

See https://github.com/amiaopensource/ffmprovisr/issues/392
2019-07-31 23:37:53 +12:00
Reto Kromer
283756f8cf Merge pull request #390 (Revert "update recipe list") 2019-07-19 19:34:49 +02:00
Ashley
d28ae29f5c Merge pull request #389 from amiaopensource/revert-387-issue-383
Revert "Adds mapping all audio to access script"
2019-07-19 13:33:24 -04:00
Reto Kromer
2be5576012 Revert "update recipe list" 2019-07-19 19:25:01 +02:00
Ashley
43c98527a7 Revert "Adds mapping all audio to access script" 2019-07-19 13:11:06 -04:00
Reto Kromer
164d757309 Merge pull request #388 (update recipe list) 2019-07-17 19:14:07 +02:00
Ashley
2a87a120c3 Merge pull request #387 from amiaopensource/issue-383
Adds mapping all audio to access script
2019-07-17 12:42:07 -04:00
Ashley
fbe5f216a7 patch linebreaks 2019-07-17 12:40:50 -04:00
Reto Kromer
f93922a9c3 update recipe list 2019-07-17 18:34:00 +02:00
Ashley Blewer
e06a76f559 Adds mapping all audio to access script 2019-07-17 12:08:14 -04:00
Ashley
0279c1d842 Merge pull request #385 from amiaopensource/fix-intrapage-anchor-bug
Fix intrapage anchor bug
2019-07-15 11:49:40 -04:00
Ashley Blewer
7e72b1c254 Links updates within categories #384 2019-07-13 21:38:38 -04:00
Ashley Blewer
07fe8bf966 Move repeated JS into functions 2019-07-13 18:41:44 -04:00
Ashley Blewer
c32a7f44ad Supports intralinking for recipes 2019-07-13 17:52:49 -04:00
Ashley
ea2c29a38c Merge pull request #382 from mipops/gh-pages
Add Micropops to Sister Projects
2019-07-02 18:26:14 -04:00
A. Lavigne
d624a3fc11 Add Micropops to Sister Projects 2019-07-02 15:08:23 -07:00
Ashley
ade2615da3 Merge pull request #378 from amiaopensource/lowercase_hex
use always lowercase for hex
2019-03-24 18:20:31 +01:00
Ashley
72545d5c31 Merge pull request #376 from amiaopensource/add_recipe_list
add recipe list
2019-03-24 18:19:51 +01:00
Reto Kromer
c6215c1953 use always lowercase for hex 2019-03-24 11:25:02 +01:00
Reto Kromer
abfb9ea982 shorter one-liner 2019-03-24 09:43:33 +01:00
Reto Kromer
02beb6ab1d update link 2019-03-24 09:40:33 +01:00
Reto Kromer
b552ec4a31 update ReadMe 2019-03-24 09:39:47 +01:00
Reto Kromer
c26c0d57ea Create get_recipe_list 2019-03-24 09:36:03 +01:00
Reto Kromer
d023bf7500 Merge pull request #375 (delete period) 2019-03-23 19:52:14 +01:00
Reto Kromer
5b795e53dd add recipe list 2019-03-23 17:35:54 +01:00
Reto Kromer
806fd0c49b delete period 2019-03-23 17:34:21 +01:00
Reto Kromer
8a2cdbc088 Merge pull request #373 (unify syntax of recipe with syntax of the index) 2019-02-28 17:45:43 +01:00
Reto Kromer
9df208345c unify syntax of recipe with syntax of the index 2019-02-28 16:30:19 +01:00
Ashley
19e38145dd Merge pull request #372 from amiaopensource/h264
complete information
2019-02-18 10:25:39 -05:00
Reto Kromer
7453e500df complete information 2019-02-18 07:23:35 +01:00
Andrew Weaver
8ceb0f4fc6 Merge pull request #370 from amiaopensource/update-contributors
Update contributors
2019-02-11 18:48:52 -08:00
Andrew Weaver
d95c2e6aa1 update date 2019-02-11 16:21:25 -08:00
Andrew Weaver
ef82e43fb8 update contributors
add @b00giehead and @mgiraldo to README

fix spacing
2019-02-11 16:21:24 -08:00
Reto Kromer
445bd681a0 Merge pull request #369 (update installation instructions) 2019-02-07 15:44:06 +01:00
Reto Kromer
c01f821b59 update installation instructions 2019-02-07 09:38:16 +01:00
Andrew Weaver
47575a57ed Merge pull request #367 from amiaopensource/silence-trim
Silence trim
2019-02-03 19:06:48 -08:00
Weaver
2d6bf9159f change wording 2019-02-01 15:53:36 -08:00
Weaver
60d452a431 wording 2019-02-01 10:03:24 -08:00
Andrew Weaver
dbd7687fb4 rough start to end trim
little less rough

more silence
2019-01-31 19:27:44 -08:00
Andrew Weaver
193d5f30fb start trim start silence
update id
2019-01-28 16:58:12 -08:00
Andrew Weaver
7ad290734e remove video specific language 2019-01-23 16:41:43 -08:00
Andrew Weaver
9686a76ed6 change to match ToC 2019-01-23 16:38:13 -08:00
Reto Kromer
2dee34d429 uniform URLs (#364) 2019-01-17 15:11:25 +01:00
Ashley
6daace9149 Merge pull request #363 from b00giehead/patch-2
add "synchronize video and audio streams" recipe
2019-01-16 19:00:14 -05:00
Joanna White
01a7404ece Update index.html 2019-01-16 13:04:02 +00:00
5 changed files with 357 additions and 63 deletions

View File

@@ -62,6 +62,7 @@
<span class="intro-lead">Sister projects</span>
<p><a href="https://dd388.github.io/crals/" target="_blank">Script Ahoy</a>: Community Resource for Archivists and Librarians Scripting</p>
<p><a href="https://datapraxis.github.io/sourcecaster/" target="_blank">The Sourcecaster</a>: an app that helps you use the command line to work through common challenges that come up when working with digital primary sources.</p>
<p><a href="https://pugetsoundandvision.github.io/micropops/" target="_blank">Micropops</a>: One liners and automation tools from Moving Image Preservation of Puget Sound</p>
<p><a href="https://amiaopensource.github.io/cable-bible/" target="_blank">Cable Bible</a>: A Guide to Cables and Connectors Used for Audiovisual Tech</p>
</div>
@@ -212,28 +213,6 @@
</div>
<!-- End Basic rewrap command -->
<!-- MKV to MP4 -->
<label class="recipe" for="mkv_to_mp4">Convert Matroska (MKV) to MP4</label>
<input type="checkbox" id="mkv_to_mp4">
<div class="hiding">
<h3>MKV to MP4</h3>
<p><code>ffmpeg -i <em>input_file</em>.mkv -c:v copy -c:a aac <em>output_file</em>.mp4</code></p>
<p>This will convert your Matroska (MKV) files to MP4 files.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path and name of the input file<br>
The extension for the Matroska container is <code>.mkv</code>.</dd>
<dt>-c:v copy</dt><dd>copies the video stream without re-encoding it</dd>
<dt>-c:a aac</dt><dd>re-encodes the audio stream using the AAC audio codec<br>
Note that sadly MP4 cannot contain sound encoded by a PCM (Pulse-Code Modulation) audio codec.<br>
For silent videos you can replace <code>-c:a aac</code> by <code>-an</code>, which means that there will be no audio track in the output file.</dd>
<dt><em>output_file</em></dt><dd>path and name of the output file<br>
The extension for the MP4 container is <code>.mp4</code>.</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends MKV to MP4 -->
<!-- Rewrap DV -->
<label class="recipe" for="rewrap-dv">Rewrap DV video to .dv file</label>
<input type="checkbox" id="rewrap-dv">
@@ -314,7 +293,7 @@
<dl>
<dt>-preset <em>veryslow</em></dt><dd>This option tells FFmpeg to use the slowest preset possible for the best compression quality.<br>
Available presets, from slowest to fastest, are: <code>veryslow</code>, <code>slower</code>, <code>slow</code>, <code>medium</code>, <code>fast</code>, <code>faster</code>, <code>veryfast</code>, <code>superfast</code>, <code>ultrafast</code>.</dd>
<dt>-crf <em>18</em></dt><dd>Specifying a lower CRF will make a larger file with better visual quality. For H.264 files being encoded with a 4:2:0 chroma subsampling scheme (i.e., using <code>-pix_fmt yuv420p</code>), the scale ranges between 0-51, with 0 being lossless and 51 the worst possible quality.<br>
<dt>-crf <em>18</em></dt><dd>Specifying a lower CRF will make a larger file with better visual quality. For H.264 files being encoded with a 4:2:0 chroma subsampling scheme (i.e., using <code>-pix_fmt yuv420p</code>), the scale ranges between 0-51 for 8-bit content, with 0 being lossless and 51 the worst possible quality.<br>
If no crf is specified, <code>libx264</code> will use a default value of 23. 18 is often considered a “visually lossless” compression.</dd>
</dl>
<p>For more information, see the <a href="https://trac.ffmpeg.org/wiki/Encode/H.264" target="_blank">FFmpeg and H.264 Encoding Guide</a> on the FFmpeg wiki.</p>
@@ -427,7 +406,7 @@
<dt><em>output file</em></dt><dd>path, name and extension of the output file</dd>
</dl>
<p>The libx265 encoding library defaults to a medium preset for compression quality and a CRF of 28. CRF stands for constant rate factor and determines the quality and file size of the resulting H.265 video. The CRF scale ranges from 0 (best quality [lossless]; largest file size) to 51 (worst quality; smallest file size).</p>
<p>A CRF of 28 for H.265 can be considered a medium setting, <a href="https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF" target="_blank">corresponding</a> to a CRF of 23 in <a href="./index.html#transcode_h264">encoding H.264</a>, but should result in about half the file size.</p>
<p>A CRF of 28 for H.265 can be considered a medium setting, <a href="https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF" target="_blank">corresponding</a> to a CRF of 23 in <a href="#transcode_h264">encoding H.264</a>, but should result in about half the file size.</p>
<p>To create a higher quality file, you can add these presets:</p>
<p><code>ffmpeg -i <em>input_file</em> -c:v libx265 -pix_fmt yuv420p -preset veryslow -crf 18 -c:a copy <em>output_file</em></code></p>
<dl>
@@ -453,7 +432,7 @@
<dt>-b:v 690k</dt><dd>specifies the 690k video bitrate</dd>
<dt><em>output file</em></dt><dd>path, name and extension of the output file (make sure to include the <code>.ogv</code> filename suffix)</dd>
</dl>
<p>This recipe is based on <a href="http://paulrouget.com/e/converttohtml5video">Paul Rouget's recipes</a>.</p>
<p>This recipe is based on <a href="http://paulrouget.com/e/converttohtml5video" target="_blank">Paul Rouget's recipes</a>.</p>
<p class="link"></p>
</div>
<!-- ends Transcode to Ogg/Theora -->
@@ -488,7 +467,7 @@
<!-- ends WAV to MP3 -->
<!-- append notice to access mp3 -->
<label class="recipe" for="append_mp3">Generate two access MP3s (with and without copyright).</label>
<label class="recipe" for="append_mp3">Generate two access MP3s (with and without copyright)</label>
<input type="checkbox" id="append_mp3">
<div class="hiding">
<h3>Generate two access MP3s from input. One with appended audio (such as a copyright notice) and one unmodified.</h3>
@@ -623,7 +602,7 @@
<label class="recipe" for="change_DAR">Change display aspect ratio without re-encoding</label>
<input type="checkbox" id="change_DAR">
<div class="hiding">
<h3>Change Display Aspect Ratio without reencoding video</h3>
<h3>Change Display Aspect Ratio without re-encoding video</h3>
<p><code>ffmpeg -i <em>input_file</em> -c:v copy -aspect 4:3 <em>output_file</em></code></p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
@@ -680,7 +659,7 @@
<img src="./img/colourspace_metadata_mediainfo.png" alt="MediaInfo screenshots of colorspace metadata"><br>
<p><span class="beware"></span> Using this command it is possible to add Rec.709 tags to a file that is actually Rec.601 (etc), so apply with caution!</p>
<p>These commands are relevant for H.264 and H.265 videos, encoded with <code>libx264</code> and <code>libx265</code> respectively.</p>
<p><strong>Note:</strong> If you wish to embed colorspace metadata <em>without</em> changing to another colorspace, omit <code>-vf colormatrix=src:dst</code>. However, since it is <code>libx264</code>/<code>libx265</code> that writes the metadata, its not possible to add these tags without reencoding the video stream.</p>
<p><strong>Note:</strong> If you wish to embed colorspace metadata <em>without</em> changing to another colorspace, omit <code>-vf colormatrix=src:dst</code>. However, since it is <code>libx264</code>/<code>libx265</code> that writes the metadata, its not possible to add these tags without re-encoding the video stream.</p>
<p>For all possible values for <code>-color_primaries</code>, <code>-color_trc</code>, and <code>-colorspace</code>, see the FFmpeg documentation on <a href="https://ffmpeg.org/ffmpeg-codecs.html#Codec-Options" target="_blank">codec options</a>.</p>
<hr>
<p id="fn1" class="footnote">1. Out of step with the regular pattern, <code>-color_trc</code> doesnt accept <code>bt470bg</code>; it is instead here referred to directly as gamma.<br>
@@ -713,6 +692,26 @@
<p class="link"></p>
</div>
<!-- ends Modify speed -->
<!-- Synchronize video and audio streams -->
<label class="recipe" for="sync_streams">Synchronize video and audio streams</label>
<input type="checkbox" id="sync_streams">
<div class="hiding">
<h3>Synchronize video and audio streams</h3>
<p><code>ffmpeg -i <em>input_file</em> -itsoffset 0.125 -i <em>input_file</em> -map 1:v -map 0:a -c copy <em>output_file</em></code></p>
<p>A command to slip the video channel approximate 2 frames (0.125 for a 25fps timeline) to align video and audio drift, if generated during video tape capture for example.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
<dt>-itsoffset 0.125</dt><dd>uses itsoffset command to set offset to 0.125 of a second. The offset time must be a time duration specification, see <a href="https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax" target="_blank">FFMPEG Utils Time Duration Syntax</a>.</dd>
<dt>-i <em>input_file</em></dt><dd>repeat path, name and extension of the input file</dd>
<dt>-map 1:v -map 0:a</dt><dd>selects the video channel for itsoffset command. To slip the audio channel reverse the selection to -map 0:v -map 1:a.</dd>
<dt>-c copy</dt><dd>copies the encode settings of the input_file to the output_file</dd>
<dt><em>output_file_resync</em></dt><dd>path, name and extension of the output_file</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Synchronize video and audio streams -->
<!-- Make stream properties explicate -->
<label class="recipe" for="clarify_stream">Clarify stream properties</label>
@@ -801,7 +800,7 @@
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
<dt>-c:v prores_ks</dt><dd>encodes the video to ProRes (prores_ks marks the stream as interlaced, unlike prores)</dd>
<dt>-flags +ildct</dt><dd>ensures that the output_file has interlaced field encoding, using interlace aware discrete cosine transform</em></dd>
<dt>-flags +ildct</dt><dd>ensures that the output_file has interlaced field encoding, using interlace aware discrete cosine transform</dd>
<dt>-map 0</dt><dd>ensures ffmpeg maps all streams of the input_file to the output_file</dd>
<dt>-c:a copy</dt><dd>copies the encode settings of the input_file to the output_file</dd>
<dt><em>output_file</em></dt><dd>path, name and extension of the output file</dd>
@@ -995,7 +994,7 @@
</div>
<div class="well">
<h2 id="join-trim">Join, trim, or excerpt a video</h2>
<h2 id="join-trim">Join, trim, or create an excerpt</h2>
<!-- Join files of the same type together -->
<label class="recipe" for="join_files">Join (concatenate) two or more files of the same type</label>
@@ -1069,12 +1068,12 @@
<p>(The Lanczos scaling algorithm is recommended, as it is slower but better than the default bilinear algorithm).</p>
<p>The rescaling should be applied just before the point where the streams to be used in the output file are listed. Select the stream you want to rescale, apply the filter, and assign that to a variable name (<code>rescaled_video</code> in the below example). Then you use this variable name in the list of streams to be concatenated.</p>
<p><code>ffmpeg -i input_1.avi -i input_2.mp4 -filter_complex "[0:v:0] scale=1920:1080:flags=lanczos [rescaled_video], [rescaled_video] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [video_out] [audio_out]" -map "[video_out]" -map "[audio_out]" <em>output_file</em></code></p>
<p>However, this will only have the desired visual output if the inputs have the same aspect ratio. If you wish to concatenate an SD and an HD file, you will also wish to pillarbox the SD file while upscaling. (See the <a href="https://amiaopensource.github.io/ffmprovisr/#SD_HD_2">Convert 4:3 to pillarboxed HD</a> command). The full command would look like this:</p>
<p>However, this will only have the desired visual output if the inputs have the same aspect ratio. If you wish to concatenate an SD and an HD file, you will also wish to pillarbox the SD file while upscaling. (See the <a href="#SD_HD_2">Convert 4:3 to pillarboxed HD</a> command). The full command would look like this:</p>
<p><code>ffmpeg -i input_1.avi -i input_2.mp4 -filter_complex "[0:v:0] scale=1440:1080:flags=lanczos, pad=1920:1080:(ow-iw)/2:(oh-ih)/2 [to_hd_video], [to_hd_video] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [video_out] [audio_out]" -map "[video_out]" -map "[audio_out]" <em>output_file</em></code></p>
<p>Here, the first input is an SD file which needs to be upscaled to match the second input, which is 1920x1080. The scale filter enlarges the SD input to the height of the HD frame, keeping the 4:3 aspect ratio; then, the video is pillarboxed within a 1920x1080 frame.</p>
<h4>Variation: concatenating files of different framerates</h4>
<p>If the input files have different framerates, then the output file may be of variable framerate. To explicitly obtain an output file of constant framerate, you may wish convert an input (or multiple inputs) to a different framerate prior to concatenation.</p>
<p>You can speed up or slow down a file using the <code>fps</code> and <code>atempo</code> filters (see also the <a href="https://amiaopensource.github.io/ffmprovisr/#modify_speed">Modify speed</a> command).</p>
<p>You can speed up or slow down a file using the <code>fps</code> and <code>atempo</code> filters (see also the <a href="#modify_speed">Modify speed</a> command).</p>
<p>Here's an example of the full command, in which input_1 is 30fps, input_2 is 25fps, and 25fps is the desired output speed.</p>
<p><code>ffmpeg -i input_1.avi -i input_2.mp4 -filter_complex "[0:v:0] fps=fps=25 [video_to_25fps]; [0:a:0] atempo=(25/30) [audio_to_25fps]; [video_to_25fps] [audio_to_25fps] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [video_out] [audio_out]" -map "[video_out]" -map "[audio_out]" <em>output_file</em></code></p>
<p>Note that the <code>fps</code> filter will drop or repeat frames as necessary in order to achieve the desired frame rate - see the FFmpeg <a href="https://ffmpeg.org/ffmpeg-filters.html#fps-1" target="_blank">fps docs</a> for more details.</p>
@@ -1115,12 +1114,12 @@
<!-- ends Split file into segments -->
<!-- Trim -->
<label class="recipe" for="trim">Trim video</label>
<label class="recipe" for="trim">Trim file</label>
<input type="checkbox" id="trim">
<div class="hiding">
<h3>Trim a video without re-encoding</h3>
<p><code>ffmpeg -i <em>input_file</em> -ss 00:02:00 -to 00:55:00 -c copy -map 0 <em>output_file</em></code></p>
<p>This command allows you to create an excerpt from a video file without re-encoding the image data.</p>
<p>This command allows you to create an excerpt from a file without re-encoding the audiovisual data.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
@@ -1131,7 +1130,7 @@
<strong>Note:</strong> watch out when using <code>-ss</code> with <code>-c copy</code> if the source is encoded with an interframe codec (e.g., H.264). Since FFmpeg must split on i-frames, it will seek to the nearest i-frame to begin the stream copy.</dd>
<dt><em>output_file</em></dt><dd>path, name and extension of the output file</dd>
</dl>
<p>Variation: trim video by setting duration, by using <code>-t</code> instead of <code>-to</code></p>
<p>Variation: trim file by setting duration, by using <code>-t</code> instead of <code>-to</code></p>
<p><code>ffmpeg -i <em>input_file</em> -ss 00:05:00 -t 10 -c copy <em>output_file</em></code></p>
<dl>
<dt>-ss 00:05:00 -t 10</dt><dd>Beginning five minutes into the original video, this command will create a 10-second-long excerpt.</dd>
@@ -1147,7 +1146,7 @@
<div class="hiding">
<h3>Excerpt from beginning</h3>
<p><code>ffmpeg -i <em>input_file</em> -t <em>5</em> -c copy -map 0 <em>output_file</em></code></p>
<p>This command captures a certain portion of a video file, starting from the beginning and continuing for the amount of time (in seconds) specified in the script. This can be used to create a preview file, or to remove unwanted content from the end of the file. To be more specific, use timecode, such as 00:00:05.</p>
<p>This command captures a certain portion of a file, starting from the beginning and continuing for the amount of time (in seconds) specified in the script. This can be used to create a preview file, or to remove unwanted content from the end of the file. To be more specific, use timecode, such as 00:00:05.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
@@ -1161,12 +1160,12 @@
<!-- ends Excerpt from beginning -->
<!-- Excerpt to end -->
<label class="recipe" for="excerpt_to_end">Create a new video file with the first five seconds trimmed off the original</label>
<label class="recipe" for="excerpt_to_end">Create a new file with the first five seconds trimmed off the original</label>
<input type="checkbox" id="excerpt_to_end">
<div class="hiding">
<h3>Excerpt to end</h3>
<p><code>ffmpeg -i <em>input_file</em> -ss <em>5</em> -c copy -map 0 <em>output_file</em></code></p>
<p>This command copies a video file starting from a specified time, removing the first few seconds from the output. This can be used to create an excerpt, or remove unwanted content from the beginning of a video file.</p>
<p>This command copies a file starting from a specified time, removing the first few seconds from the output. This can be used to create an excerpt, or remove unwanted content from the beginning of a file.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
@@ -1180,12 +1179,12 @@
<!-- ends Excerpt to end -->
<!-- Excerpt from end -->
<label class="recipe" for="excerpt_from_end">Create a new video file with the final five seconds of the original</label>
<label class="recipe" for="excerpt_from_end">Create a new file with the final five seconds of the original</label>
<input type="checkbox" id="excerpt_from_end">
<div class="hiding">
<h3>Excerpt from end</h3>
<p><code>ffmpeg -sseof <em>-5</em> -i <em>input_file</em> -c copy -map 0 <em>output_file</em></code></p>
<p>This command copies a video file starting from a specified time before the end of the file, removing everything before from the output. This can be used to create an excerpt, or extract content from the end of a video file (e.g. for extracting the closing credits).</p>
<p>This command copies a file starting from a specified time before the end of the file, removing everything before from the output. This can be used to create an excerpt, or extract content from the end of a file (e.g. for extracting the closing credits).</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-sseof <em>-5</em></dt><dd>This parameter must stay before the input file. It tells FFmpeg what timecode in the file to look for to start copying, and specifies the number of seconds from the end of the video that FFmpeg should start copying. The end of the file has index 0 and the minus sign is needed to reference earlier portions. To be more specific, you can use timecode such as -00:00:05. Note that in most file formats it is not possible to seek exactly, so FFmpeg will seek to the closest point before.</dd>
@@ -1198,6 +1197,50 @@
</div>
<!-- ends Excerpt from end -->
<!-- Trim start silence -->
<label class="recipe" for="trim_start_silence">Trim silence from beginning of an audio file</label>
<input type="checkbox" id="trim_start_silence">
<div class="hiding">
<h3>Remove silent portion at the beginning of an audio file</h3>
<p><code>ffmpeg -i <em>input_file</em> -af silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 -c:a <em>your_codec_choice</em> -ar <em>your_sample_rate_choice</em> <em>output_file</em></code></p>
<p>This command will automatically remove silence at the beginning of an audio file. The threshold for what qualifies as silence can be changed - this example uses anything under -57 dB, which is a decent level for accounting for analogue hiss.</p>
<p><strong>Note:</strong> Since this command uses a filter, the audio stream will be re-encoded for the output. If you do not specify a sample rate or codec, this command will use the sample rate from your input and <a href='#codec-defaults'>the codec defaults for your output format</a>. Take care that you are getting your intended results!</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file (e.g. input_file.wav)</dd>
<dt>-af silenceremove</dt><dd>applies the silence remove filter</dd>
<dt>start_threshold=-57dB</dt><dd>tells the filter the threshold for what to call 'silence' for the purpose of removal. This can be increased or decreased as necessary.</dd>
<dt>start_duration=1</dt><dd>This tells the filter how much non-silent audio must be detected before it stops trimming. With a value of <code>0</code> the filter would stop after detecting any non-silent audio. A setting of <code>1</code> allows it to continue trimming through short 'pops' such as those caused by engaging the playback device, or the recorded sound of a microphone being plugged in.</dd>
<dt>start_periods=1</dt><dd>This tells the filter to trim the first example of silence it discovers from the beginning of the file. This value could be increased to remove subsequent silent portions from the file if desired.</dd>
<dt>-c:a <em>your_codec_choice</em></dt><dd>This tells the filter what codec to use, and must be specified to avoid defaults. If you want 24 bit PCM, your value would be <code>-c:a pcm_s24le</code>.</dd>
<dt><em>output_file</em></dt><dd>path, name and extension of the output file (e.g. output_file.wav).</dd>
</dl>
</div>
<!-- ends Trim start silence -->
<!-- Trim end silence -->
<label class="recipe" for="trim_end_silence">Trim silence from the end of an audio file</label>
<input type="checkbox" id="trim_end_silence">
<div class="hiding">
<h3>Remove silent portion from the end of an audio file</h3>
<p><code>ffmpeg -i <em>input_file</em> -af areverse,silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1,areverse -c:a <em>your_codec_choice</em> -ar <em>your_sample_rate_choice</em> <em>output_file</em></code></p>
<p>This command will automatically remove silence at the end of an audio file. Since the <code>silenceremove</code> filter is best at removing silence from the beginning of files, this command used the <code>areverse</code> filter twice to reverse the input, remove silence and then restore correct orientation.</p>
<p><strong>Note:</strong> Since this command uses a filter, the audio stream will be re-encoded for the output. If you do not specify a sample rate or codec, this command will use the sample rate from your input and <a href='#codec-defaults'>the codec defaults for your output format</a>. Take care that you are getting your intended results!</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file (e.g. input_file.wav)</dd>
<dt>-af areverse,</dt><dd>starts the filter chain with reversing the input</dd>
<dt>silenceremove</dt><dd>applies the silence remove filter</dd>
<dt>start_threshold=-57dB</dt><dd>tells the filter the threshold for what to call 'silence' for the purpose of removal. This can be increased or decreased as necessary.</dd>
<dt>start_duration=1</dt><dd>This tells the filter how much non-silent audio must be detected before it stops trimming. With a value of <code>0</code> the filter would stop after detecting any non-silent audio. A setting of <code>1</code> allows it to continue trimming through short 'pops' such as those caused by engaging the playback device, or the recorded sound of a microphone being plugged in.</dd>
<dt>start_periods=1</dt><dd>This tells the filter to trim the first example of silence it discovers.</dd>
<dt>areverse</dt><dd>applies the audio reverse filter again to restore input to correct orientation.</dd>
<dt>-c:a <em>your_codec_choice</em></dt><dd>This tells the filter what codec to use, and must be specified to avoid defaults. If you want 24 bit PCM, your value would be <code>-c:a pcm_s24le</code>.</dd>
<dt><em>output_file</em></dt><dd>path, name and extension of the output file (e.g. output_file.wav).</dd>
</dl>
</div>
<!-- ends Trim end silence -->
</div>
<div class="well">
<h2 id="interlacing">Work with interlaced video</h2>
@@ -1251,7 +1294,7 @@
<p><code>"yadif,format=yuv420p"</code> is an FFmpeg <a href="https://trac.ffmpeg.org/wiki/FilteringGuide#FiltergraphChainFilterrelationship" target="_blank">filtergraph</a>. Here the filtergraph is made up of one filter chain, which is itself made up of the two filters (separated by the comma).<br>
The enclosing quote marks are necessary when you use spaces within the filtergraph, e.g. <code>-vf "yadif, format=yuv420p"</code>, and are included above as an example of good practice.</p>
<p><strong>Note:</strong> FFmpeg includes several deinterlacers apart from <a href="https://ffmpeg.org/ffmpeg-filters.html#yadif-1" target="_blank">yadif</a>: <a href="https://ffmpeg.org/ffmpeg-filters.html#bwdif" target="_blank">bwdif</a>, <a href="https://ffmpeg.org/ffmpeg-filters.html#w3fdif" target="_blank">w3fdif</a>, <a href="https://ffmpeg.org/ffmpeg-filters.html#kerndeint" target="_blank">kerndeint</a>, and <a href="https://ffmpeg.org/ffmpeg-filters.html#nnedi" target="_blank">nnedi</a>.</p>
<p>For more H.264 encoding options, see the latter section of the <a href="./index.html#transcode_h264">encode H.264 command</a>.</p>
<p>For more H.264 encoding options, see the latter section of the <a href="#transcode_h264">encode H.264 command</a>.</p>
<div class="sample-image">
<h2>Example</h2>
<p>Before and after deinterlacing:</p>
@@ -1797,7 +1840,7 @@
<input type="checkbox" id="batch_processing_win">
<div class="hiding">
<h3>Create PowerShell script to batch process with FFmpeg</h3>
<p>As of Windows 10, it is possible to run Bash via <a href="https://msdn.microsoft.com/en-us/commandline/wsl/about" target="_blank">Bash on Ubuntu on Windows</a>, allowing you to use <a href="index.html#batch_processing_bash">bash scripting</a>. To enable Bash on Windows, see <a href="https://msdn.microsoft.com/en-us/commandline/wsl/install_guide" target="_blank">these instructions</a>.</p>
<p>As of Windows 10, it is possible to run Bash via <a href="https://msdn.microsoft.com/en-us/commandline/wsl/about" target="_blank">Bash on Ubuntu on Windows</a>, allowing you to use <a href="#batch_processing_bash">bash scripting</a>. To enable Bash on Windows, see <a href="https://msdn.microsoft.com/en-us/commandline/wsl/install_guide" target="_blank">these instructions</a>.</p>
<p>On Windows, the primary native command line program is <strong>PowerShell</strong>. PowerShell scripts are plain text files saved with a .ps1 extension. This entry explains how they work with the example of a PowerShell script named “rewrap-mp4.ps1”, which rewraps .mp4 files in a given directory to .mkv files.</p>
<p>“rewrap-mp4.ps1” contains the following text:</p>
<pre class="codeblock"><code>$inputfiles = ls *.mp4
@@ -1942,7 +1985,7 @@
<dt>-loglevel error</dt><dd>sets the verbosity of logging to show all errors</dd>
<dt>-i <em>input_file</em></dt><dd>path, name and extension of the input file</dd>
<dt>-map 0:v:0</dt><dd>designated the first video stream as the stream on which to perform this hash generation operation. <code>-map 0</code> can be used to run the operation on all streams.</dd>
<dt>-f hash -hash md5</dt><dd>produce a checksum hash, and set the hash algorithm to md5. See the official <a href="https://ffmpeg.org/ffmpeg-formats.html#hash">documentation on hash</a> for other algorithms.</dd>
<dt>-f hash -hash md5</dt><dd>produce a checksum hash, and set the hash algorithm to md5. See the official <a href="https://ffmpeg.org/ffmpeg-formats.html#hash" target="_blank">documentation on hash</a> for other algorithms.</dd>
<dt>-</dt><dd>FFmpeg syntax requires a specified output, and <code>-</code> is just a place holder. No file is actually created.</dd>
</dl>
<p class="link"></p>
@@ -2073,7 +2116,7 @@
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-f lavfi</dt><dd>tells FFmpeg to use the <a href="https://ffmpeg.org/ffmpeg-devices.html#lavfi" target="_blank">libavfilter</a> input virtual device</dd>
<dt>-i testsrc=size=720x576:rate=25</dt><dd>asks for the testsrc filter pattern as input. Adjusting the <code>size</code> and <code>rate</code> options allows you to choose a specific frame size and framerate. <br>
<dt>-i testsrc=size=720x576:rate=25</dt><dd>asks for the testsrc filter pattern as input. Adjusting the <code>size</code> and <code>rate</code> options allows you to choose a specific frame size and framerate.<br>
The different test patterns that can be generated are listed <a href="https://ffmpeg.org/ffmpeg-filters.html#allrgb_002c-allyuv_002c-color_002c-haldclutsrc_002c-nullsrc_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc" target="_blank">here</a>.</dd>
<dt>-c:v v210</dt><dd>transcodes video from rawvideo to 10-bit Uncompressed YC<sub>B</sub>C<sub>R</sub> 4:2:2. Alter this setting to set your desired codec.</dd>
<dt>-t 10</dt><dd>specifies recording time of 10 seconds</dd>
@@ -2179,7 +2222,7 @@
<div class="hiding">
<h3>Conway's Game of Life</h3>
<p>Simulates <a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life" target="_blank">Conway's Game of Life</a></p>
<p><code>ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800</code></p>
<p><code>ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#c83232:life_color=#00ff00,scale=1200:800</code></p>
<dl>
<dt>ffplay</dt><dd>starts the command</dd>
<dt>-f lavfi</dt><dd>tells ffplay to use the <a href="https://ffmpeg.org/ffmpeg-devices.html#lavfi" target="_blank">Libavfilter</a> input virtual device</dd>
@@ -2187,13 +2230,13 @@
<dt>:</dt><dd>indicates theres another parameter coming</dd>
<dt>mold=10:r=60:ratio=0.1</dt><dd>sets up the rules of the game: cell mold speed, video rate, and random fill ratio</dd>
<dt>:</dt><dd>indicates theres another parameter coming</dd>
<dt>death_color=#C83232:life_color=#00ff00</dt><dd>specifies color for cell death and cell life; mold_color can also be set</dd>
<dt>death_color=#c83232:life_color=#00ff00</dt><dd>specifies color for cell death and cell life; mold_color can also be set</dd>
<dt>,</dt><dd>comma signifies closing of video source assertion and ready for filter assertion</dd>
<dt>scale=1200:800</dt><dd>scale to 1280 width and 800 height</dd>
</dl>
<img src="img/life.gif" alt="GIF of above command">
<p>To save a portion of the stream instead of playing it back infinitely, use the following command:</p>
<p><code>ffmpeg -f lavfi -i life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800 -t 5 <em>output_file</em></code></p>
<p><code>ffmpeg -f lavfi -i life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#c83232:life_color=#00ff00,scale=1200:800 -t 5 <em>output_file</em></code></p>
<p class="link"></p>
</div>
<!-- ends Game of Life -->
@@ -2497,7 +2540,7 @@
<input type="checkbox" id="find-offset">
<div class="hiding">
<h3>Find Drive Offset for Exact CD Ripping</h3>
<p>If you want to make CD rips that can be verified via checksums to other rips of the same content, you need to know the offset of your CD drive. Put simply, different models of CD drives have different offsets, meaning they start reading in slightly different locations. This must be compensated for in order for files created on different (model) drives to generate the same checksum. For a more detailed explanation of drive offsets see the explanation <a href="http://dbpoweramp.com/spoons-audio-guide-cd-ripping.htm">here.</a> In order to find your drive offset, first you will need to know exactly what model your drive is, then you can look it up in the list of drive offsets by Accurate Rip.</p>
<p>If you want to make CD rips that can be verified via checksums to other rips of the same content, you need to know the offset of your CD drive. Put simply, different models of CD drives have different offsets, meaning they start reading in slightly different locations. This must be compensated for in order for files created on different (model) drives to generate the same checksum. For a more detailed explanation of drive offsets see the explanation <a href="https://dbpoweramp.com/spoons-audio-guide-cd-ripping.htm" target="_blank">here.</a> In order to find your drive offset, first you will need to know exactly what model your drive is, then you can look it up in the list of drive offsets by Accurate Rip.</p>
<p>Often it can be difficult to tell what model your drive is simply by looking at it - it may be housed inside your computer or have external branding that is different from the actual drive manufacturer. For this reason, it can be useful to query your drive with CD ripping software in order to ID it. The following commands should give you a better idea of what drive you have.</p>
<p><strong>Cdda2wav:</strong> <code>cdda2wav -scanbus</code> or simply <code>cdda2wav</code></p>
<p><strong>CD Paranoia:</strong> <code>cdparanoia -vsQ</code></p>

View File

@@ -1,23 +1,38 @@
$(document).ready(function() {
// open recipe window if a hash is found in URL
if(window.location.hash) {
id = window.location.hash
console.log(id.substring(1))
function appendLink(id) {
$(id).next('div').find('.link').empty();
$(id).next('div').find('.link').append("<small>Link to this command: <a href='https://amiaopensource.github.io/ffmprovisr/index.html" + id + "'>https://amiaopensource.github.io/ffmprovisr/index.html" + id + "</a></small>");
}
function moveToRecipe(id) {
document.getElementById(id.substring(1)).checked = true;
$('html, body').animate({ scrollTop: $(id).offset().top}, 1000);
$(id).closest('div').find('.link').empty();
$(id).closest('div').find('.link').append("<small>Link to this command: <a href='https://amiaopensource.github.io/ffmprovisr/index.html"+window.location.hash+"'>https://amiaopensource.github.io/ffmprovisr/index.html"+window.location.hash+"</a></small>");
$('html, body').animate({ scrollTop: $(id).offset().top }, 1000);
appendLink(id)
}
// open recipe window if a hash is found in URL
if (window.location.hash) {
id = window.location.hash
moveToRecipe(id)
}
// add hash URL when recipe is opened
$('label[class="recipe"]').on("click", function(){
id = $(this).attr("for");
window.location.hash = ('#' + id)
$('#' + id).closest('div').find('.link').empty();
$('#' + id).closest('div').find('.link').append("<small>Link to this command: <a href='https://amiaopensource.github.io/ffmprovisr/index.html"+window.location.hash+"'>https://amiaopensource.github.io/ffmprovisr/index.html"+window.location.hash+"</a></small>");
});
appendLink('#' + id)
})
// open recipe when clicked
$('a').on("click", function(){
intralink = $(this).attr("href")
if (intralink[0] == "#") {
moveToRecipe(intralink)
}
})
// open all windows if button is clicked
$('#open-all').on("click", function(){
$('input[type=checkbox]').each(function(){
this.checked = !this.checked;

View File

@@ -12,9 +12,10 @@ To facilitate better understanding of FFmpeg through collaborative sharing of us
The code is found in the gh-pages branch (the default primary branch). Readme is right here. You can see the site live on [GitHub pages](http://amiaopensource.github.io/ffmprovisr).
You can also install the latest [release](https://github.com/amiaopensource/ffmprovisr/releases) on your computer with the command:
You can also install the latest [release](https://github.com/amiaopensource/ffmprovisr/releases) on your computer with the two commands:
```
brew install amiaopensource/amiaos/ffmprovisr
brew tap amiaopensource/amiaos
brew install ffmprovisr
```
and then call it locally with the command:
```
@@ -22,6 +23,26 @@ ffmprovisr
```
This works currently under macOS, Linux and the Linux apps on Windows (Ubuntu and Debian tested). On classic Windows you can install the last [release](https://github.com/amiaopensource/ffmprovisr/releases) manually and the open `index.html` in a browser.
#### Parseable list of the commands
A list of all recipes in an easily parseable [ASCII text](recipes.txt) format is provided as well. It contains for each recipe its title and command in the following format:
```
# title of recipe 1
ffmpeg command 1
# title of recipe 2
ffmpeg command 2
...
# title of recipe n-1
ffmpeg command n-1
# title of recipe n
ffmpeg command n
```
The used [one-liner](scripts/get_recipe_list) is in the `scripts` folder.
## How do I contribute?
You are welcome to edit the codebase yourself, or just supply the information and ask it to be added to the site.
@@ -52,6 +73,7 @@ You can read our contributor code of conduct [here](https://github.com/amiaopens
*Code Contributors*:
ablwr (Ashley)
bastibeckr (Basti Becker)
b00giehead (Joanna White)
bturkus
dericed (Dave Rice)
edsu (Ed Summers)
@@ -61,6 +83,7 @@ kfrn (Katherine Frances Nagels)
kgrons (Kathryn Gronsbell)
kieranjol (Kieran O'Leary)
llogan (Lou)
mgiraldo (Mauricio Giraldo)
pjotrek-b (Peter B.)
privatezero (Andrew Weaver)
retokromer (Reto Kromer)
@@ -70,6 +93,7 @@ rfraimow
ablwr (Ashley)
audiovisualopen
bastibeckr (Basti Becker)
b00giehead (Joanna White)
brainwane (Sumana Harihareswara)
bturkus
dericed (Dave Rice)
@@ -88,6 +112,7 @@ kfrn (Katherine Frances Nagels)
kgrons (Kathryn Gronsbell)
kieranjol (Kieran O'Leary)
llogan (Lou)
mgiraldo (Mauricio Giraldo)
mulvya
nkrabben (Nick Krabbenhoeft)
pjotrek-b (Peter B.)
@@ -99,9 +124,9 @@ ross-spencer (Ross Spencer)
todrobbins (Tod Robbins)
Repo: amiaopensource/ffmprovisr
Code Contributors: 15
All Contributors: 30
Last updated: 2018-04-22 (4:2:2 Day)
Code Contributors: 17
All Contributors: 32
Last updated: 2019-02-11
## AVHack Team

210
recipes.txt Normal file
View File

@@ -0,0 +1,210 @@
# Basic rewrap command
ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
# Rewrap DV video to .dv file
ffmpeg -i input_file -f rawvideo -c:v copy output_file.dv
# Transcode to deinterlaced Apple ProRes LT
ffmpeg -i input_file -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le output_file.mov
# Transcode to an H.264 access file
ffmpeg -i input_file -c:v libx264 -pix_fmt yuv420p -c:a aac output_file
# Transcode from DCP to an H.264 access file
ffmpeg -i input_video_file.mxf -i input_audio_file.mxf -c:v libx264 -pix_fmt yuv420p -c:a aac output_file.mp4
# Transcode your file with the FFV1 Version 3 Codec in a Matroska container
ffmpeg -i input_file -map 0 -dn -c:v ffv1 -level 3 -g 1 -slicecrc 1 -slices 16 -c:a copy output_file.mkv -f framemd5 -an framemd5_output_file
# Convert DVD to H.264
ffmpeg -i concat:input_file_1\|input_file_2\|input_file_3 -c:v libx264 -c:a aac output_file.mp4
# Transcode to an H.265/HEVC MP4
ffmpeg -i input_file -c:v libx265 -pix_fmt yuv420p -c:a copy output_file
# Transcode to an Ogg Theora
ffmpeg -i input_file -acodec libvorbis -b:v 690k output_file
# Convert WAV to MP3
ffmpeg -i input_file.wav -write_id3v1 1 -id3v2_version 3 -dither_method rectangular -out_sample_rate 48k -qscale:a 1 output_file.mp3
# Generate two access MP3s (with and without copyright).
ffmpeg -i input_file -i input_file_to_append -filter_complex "[0:a:0]asplit=2[a][b];[b]afifo[bb];[1:a:0][bb]concat=n=2:v=0:a=1[concatout]" -map "[a]" -codec:a libmp3lame -dither_method modified_e_weighted -qscale:a 2 output_file.mp3 -map "[concatout]" -codec:a libmp3lame -dither_method modified_e_weighted -qscale:a 2 output_file_appended.mp3
# Convert WAV to AAC/MP4
ffmpeg -i input_file.wav -c:a aac -b:a 128k -dither_method rectangular -ar 44100 output_file.mp4
# Transform 4:3 aspect ratio into 16:9 with pillarbox
ffmpeg -i input_file -filter:v "pad=ih*16/9:ih:(ow-iw)/2:(oh-ih)/2" -c:a copy output_file
# Transform 16:9 aspect ratio video into 4:3 with letterbox
ffmpeg -i input_file -filter:v "pad=iw:iw*3/4:(ow-iw)/2:(oh-ih)/2" -c:a copy output_file
# Flip video image
ffmpeg -i input_file -filter:v "hflip,vflip" -c:a copy output_file
# Transform SD to HD with pillarbox
ffmpeg -i input_file -filter:v "colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos, pad=1920:1080:240:0" -c:a copy output_file
# Change display aspect ratio without re-encoding
ffmpeg -i input_file -c:v copy -aspect 4:3 output_file
# Convert colorspace of video
ffmpeg -i input_file -c:v libx264 -vf colormatrix=src:dst output_file
# Modify image and sound speed
ffmpeg -i input_file -r output_fps -filter_complex "[0:v]setpts=input_fps/output_fps*PTS[v]; [0:a]atempo=output_fps/input_fps[a]" -map "[v]" -map "[a]" output_file
# Synchronize video and audio streams
ffmpeg -i input_file -itsoffset 0.125 -i input_file -map 1:v -map 0:a -c copy output_file
# Clarify stream properties
ffprobe input_file -show_streams
# Crop video
ffmpeg -i input_file -vf "crop=width:height" output_file
# Change video color to black and white
ffmpeg -i input_file -filter_complex hue=s=0 -c:a copy output_file
# Extract audio without loss from an AV file
ffmpeg -i input_file -c:a copy -vn output_file
# Combine audio tracks
ffmpeg -i input_file -filter_complex "[0:a:0][0:a:1]amerge[out]" -map 0:v -map "[out]" -c:v copy -shortest output_file
# Inverses the audio phase of the second channel
ffmpeg -i input_file -af pan="stereo|c0=c0|c1=-1*c1" output_file
# Calculate Loudness Levels
ffmpeg -i input_file -af loudnorm=print_format=json -f null -
# RIAA Equalization
ffmpeg -i input_file -af aemphasis=type=riaa output_file
# Reverse CD Pre-Emphasis
ffmpeg -i input_file -af aemphasis=type=cd output_file
# One Pass Loudness Normalization
ffmpeg -i input_file -af loudnorm=dual_mono=true -ar 48k output_file
# Two Pass Loudness Normalization
ffmpeg -i input_file -af loudnorm=dual_mono=true:measured_I=input_i:measured_TP=input_tp:measured_LRA=input_lra:measured_thresh=input_thresh:offset=target_offset:linear=true -ar 48k output_file
# Fix A/V sync issues by resampling audio
ffmpeg -i input_file -c:v copy -c:a pcm_s16le -af "aresample=async=1000" output_file
# Join (concatenate) two or more files of the same type
ffmpeg -f concat -i mylist.txt -c copy output_file
# Join (concatenate) two or more files of different types
ffmpeg -i input_1.avi -i input_2.mp4 -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[video_out][audio_out]" -map "[video_out]" -map "[audio_out]" output_file
# Split one file into several smaller segments
ffmpeg -i input_file -c copy -map 0 -f segment -segment_time 60 -reset_timestamps 1 output_file-%03d.mkv
# Trim file
ffmpeg -i input_file -ss 00:02:00 -to 00:55:00 -c copy -map 0 output_file
# Create an excerpt, starting from the beginning of the file
ffmpeg -i input_file -t 5 -c copy -map 0 output_file
# Create a new file with the first five seconds trimmed off the original
ffmpeg -i input_file -ss 5 -c copy -map 0 output_file
# Create a new file with the final five seconds of the original
ffmpeg -sseof -5 -i input_file -c copy -map 0 output_file
# Trim silence from beginning of an audio file
ffmpeg -i input_file -af silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 -c:a your_codec_choice -ar your_sample_rate_choice output_file
# Trim silence from the end of an audio file
ffmpeg -i input_file -af areverse,silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1,areverse -c:a your_codec_choice -ar your_sample_rate_choice output_file
# Upscaled, pillar-boxed HD H.264 access files from SD NTSC source
ffmpeg -i input_file -c:v libx264 -filter:v "yadif, scale=1440:1080:flags=lanczos, pad=1920:1080:(ow-iw)/2:(oh-ih)/2, format=yuv420p" output_file
# Deinterlace video
ffmpeg -i input_file -c:v libx264 -vf "yadif,format=yuv420p" output_file
# Inverse telecine
ffmpeg -i input_file -c:v libx264 -vf "fieldmatch,yadif,decimate" output_file
# Set field order for interlaced video
ffmpeg -i input_file -c:v video_codec -filter:v setfield=tff output_file
# Identify interlacement patterns in a video file
ffmpeg -i input file -filter:v idet -f null -
# Create opaque centered text watermark
ffmpeg -i input_file -vf drawtext="fontfile=font_path:fontsize=font_size:text=watermark_text:fontcolor=font_color:alpha=0.4:x=(w-text_w)/2:y=(h-text_h)/2" output_file
# Overlay image watermark on video
ffmpeg -i input_video file -i input_image_file -filter_complex overlay=main_w-overlay_w-5:5 output_file
# Burn in timecode
ffmpeg -i input_file -vf drawtext="fontfile=font_path:fontsize=font_size:timecode=starting_timecode:fontcolor=font_colour:box=1:boxcolor=box_colour:rate=timecode_rate:x=(w-text_w)/2:y=h/1.2" output_file
Embed subtitles
ffmpeg -i input_file -i subtitles_file -c copy -c:s mov_text output_file
# Export one thumbnail per video file
ffmpeg -i input_file -ss 00:00:20 -vframes 1 thumb.png
# Export many thumbnails per video file
ffmpeg -i input_file -vf fps=1/60 out%d.png
# Create GIF from still images
ffmpeg -f image2 -framerate 9 -pattern_type glob -i "input_image_*.jpg" -vf scale=250x250 output_file.gif
# Create GIF from a video
ffmpeg -ss HH:MM:SS -i input_file -filter_complex "fps=10,scale=500:-1:flags=lanczos,palettegen" -t 3 palette.png
ffmpeg -ss HH:MM:SS -i input_file -i palette.png -filter_complex "[0:v]fps=10, scale=500:-1:flags=lanczos[v], [v][1:v]paletteuse" -t 3 -loop 6 output_file
# Transcode an image sequence into uncompressed 10-bit video
ffmpeg -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210 output_file
# Create video from image and audio
ffmpeg -r 1 -loop 1 -i image_file -i audio_file -acodec copy -shortest -vf scale=1280:720 output_file
# Audio Bitscope
ffplay -f lavfi "amovie=input_file, asplit=2[out1][a], [a]abitscope=colors=purple|yellow[out0]"
# Play a graphical output showing decibel levels of an input file
ffplay -f lavfi "amovie='input.mp3', astats=metadata=1:reset=1, adrawgraph=lavfi.astats.Overall.Peak_level:max=0:min=-30.0:size=700x256:bg=Black[out]"
# Identify pixels out of broadcast range
ffplay -f lavfi "movie='input.mp4', signalstats=out=brng:color=cyan[out]"
# Vectorscope from video to screen
ffplay input_file -vf "split=2[m][v], [v]vectorscope=b=0.7:m=color3:g=green[v], [m][v]overlay=x=W-w:y=H-h"
# Side by Side Videos/Temporal Difference Filter
ffmpeg -i input01 -i input02 -filter_complex "[0:v:0]tblend=all_mode=difference128[a];[1:v:0]tblend=all_mode=difference128[b];[a][b]hstack[out]" -map [out] -f nut -c:v rawvideo - | ffplay -
# Use xstack to arrange output layout of multiple video sources
ffplay -f lavfi -i testsrc -vf "split=3[a][b][c],[a][b][c]xstack=inputs=3:layout=0_0|0_h0|0_h0+h1[out]"
# Pull specs from video file
ffprobe -i input_file -show_format -show_streams -show_data -print_format xml
# Strip metadata
ffmpeg -i input_file -map_metadata -1 -c:v copy -c:a copy output_file
# Batch processing (Mac/Linux)
for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
# Check decoder errors
ffmpeg -i input_file -f null -
# Check FFV1 fixity
ffmpeg -report -i input_file -f null -
# Create MD5 checksums (video frames)
ffmpeg -i input_file -f framemd5 -an output_file
# Create MD5 checksums (audio samples)
ffmpeg -i input_file -af "asetnsamples=n=48000" -f framemd5 -vn output_file
# Create MD5 checksum(s) for A/V stream data only
ffmpeg -i input_file -map 0:v:0 -c:v copy -f md5 output_file_1 -map 0:a:0 -c:a copy -f md5 output_file_2
# Get checksum for video/audio stream
ffmpeg -loglevel error -i input_file -map 0:v:0 -f hash -hash md5 -
# QCTools report (with audio)
ffprobe -f lavfi -i "movie=input_file:s=v+a[in0][in1], [in0]signalstats=stat=tout+vrep+brng, cropdetect=reset=1:round=1, idet=half_life=1, split[a][b];[a]field=top[a1];[b]field=bottom, split[b1][b2];[a1][b1]psnr[c1];[c1][b2]ssim[out0];[in1]ebur128=metadata=1, astats=metadata=1:reset=1:length=0.4[out1]" -show_frames -show_versions -of xml=x=1:q=1 -noprivate | gzip > input_file.qctools.xml.gz
# QCTools report (no audio)
ffprobe -f lavfi -i "movie=input_file,signalstats=stat=tout+vrep+brng, cropdetect=reset=1:round=1, idet=half_life=1, split[a][b];[a]field=top[a1];[b]field=bottom,split[b1][b2];[a1][b1]psnr[c1];[c1][b2]ssim" -show_frames -show_versions -of xml=x=1:q=1 -noprivate | gzip > input_file.qctools.xml.gz
# Read/Extract EIA-608 Closed Captioning
ffprobe -f lavfi -i movie=input_file,readeia608 -show_entries frame=pkt_pts_time:frame_tags=lavfi.readeia608.0.line,lavfi.readeia608.0.cc,lavfi.readeia608.1.line,lavfi.readeia608.1.cc -of csv > input_file.csv
# Make a mandelbrot test pattern video
ffmpeg -f lavfi -i mandelbrot=size=1280x720:rate=25 -c:v libx264 -t 10 output_file
# Make a SMPTE bars test pattern video
ffmpeg -f lavfi -i smptebars=size=720x576:rate=25 -c:v prores -t 10 output_file
# Make a test pattern video
ffmpeg -f lavfi -i testsrc=size=720x576:rate=25 -c:v v210 -t 10 output_file
# Play HD SMPTE bars
ffplay -f lavfi -i smptehdbars=size=1920x1080
# Play VGA SMPTE bars
ffplay -f lavfi -i smptebars=size=640x480
# Generate a sine wave test audio file
ffmpeg -f lavfi -i "sine=frequency=1000:sample_rate=48000:duration=5" -c:a pcm_s16le output_file.wav
# SMPTE bars + Sine wave audio
ffmpeg -f lavfi -i "smptebars=size=720x576:rate=25" -f lavfi -i "sine=frequency=1000:sample_rate=48000" -c:a pcm_s16le -t 10 -c:v ffv1 output_file
# Make a broken file
ffmpeg -i input_file -bsf noise=1 -c copy output_file
# Conway's Game of Life
ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800
# Play video with OCR
ffplay input_file -vf "ocr,drawtext=fontfile=/Library/Fonts/Andale Mono.ttf:text=%{metadata\\\:lavfi.ocr.text}:fontcolor=white"
# Export OCR from video to screen
ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr"
# Compare Video Fingerprints
ffmpeg -i input_one -i input_two -filter_complex signature=detectmode=full:nb_inputs=2 -f null -
# Generate Video Fingerprint
ffmpeg -i input -vf signature=format=xml:filename="output.xml" -an -f null -
# Play an image sequence
ffplay -framerate 5 input_file_%06d.ext
# Split audio and video tracks
ffmpeg -i input_file -map 0:v:0 video_output_file -map 0:a:0 audio_output_file
# Merge audio and video tracks
ffmpeg -i video_file -i audio_file -map 0:v -map 1:a -c copy output_file
# Create ISO files for DVD access
ffmpeg -i input_file -aspect 4:3 -target ntsc-dvd output_file.mpg
# CSV with timecodes and YDIF
ffprobe -f lavfi -i movie=input_file,signalstats -show_entries frame=pkt_pts_time:frame_tags=lavfi.signalstats.YDIF -of csv
# Cover head switching noise
ffmpeg -i input_file -filter:v drawbox=w=iw:h=7:y=ih-h:t=max output_file
# Record and live-stream simultaneously
ffmpeg -re -i ${INPUTFILE} -map 0 -flags +global_header -vf scale="1280:-1,format=yuv420p" -pix_fmt yuv420p -level 3.1 -vsync passthrough -crf 26 -g 50 -bufsize 3500k -maxrate 1800k -c:v libx264 -c:a aac -b:a 128000 -r:a 44100 -ac 2 -t ${STREAMDURATION} -f tee "[movflags=+faststart]${TARGETFILE}|[f=flv]${STREAMTARGET}"
# View FFmpeg subprogram information
ffmpeg -h type=name
# Rip a CD with CD Paranoia
cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav
# Rip a CD with Cdda2wav
cdda2wav -L0 -t all -cuefile -paranoia paraopts=retries=200,readahead=600,minoverlap=sectors-per-request-1 -verbose-level all output.wav
# Compare two images
compare -metric ae image1.ext image2.ext null:
# Create thumbnails of images
mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg
# Creates grid of images from text file
montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg
# Get file signature data
convert -verbose input_file.ext | grep -i signature
# Removes exif metadata
mogrify -path ./stripped/ -strip *.jpg
# Resizes image to specific pixel width
convert input_file.ext -resize 750 output_file.ext
# Transcoding to/from FLAC
flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav
flac --decode --keep-foreign-metadata --preserve-modtime --verify input.flac

1
scripts/get_recipe_list Normal file
View File

@@ -0,0 +1 @@
curl https://amiaopensource.github.io/ffmprovisr/ -s | grep -E '<h3>.*</h3>|<p><code>.*</code></p>' | sed 's/.*<code>\(.*\)<\/code>/\1/' | sed 's/.*<h3>\(.*\)<\/h3>/# \1/' | grep -v '\*\*\*' | sed -e 's/<[^>]*>//g'