Compare commits

...

52 Commits

Author SHA1 Message Date
Reto Kromer
6e9d9c9a29 Merge pull request #326 (uniform external links) 2018-06-09 07:48:59 +02:00
Reto Kromer
8810d40523 uniform external links 2018-06-09 06:46:48 +02:00
Ashley
1ebea5cf19 Merge pull request #325 from amiaopensource/imagemagick2
adds more imagemagick
2018-06-08 16:30:23 -04:00
Ashley Blewer
ec3829d1b6 adds image hash grabbing recipe 2018-06-06 18:21:16 -04:00
Ashley Blewer
468b7b3a09 adds compare images script 2018-06-06 18:06:28 -04:00
Ashley Blewer
7ecd3214d5 adds rm exif data recipe 2018-06-06 17:54:00 -04:00
Ashley Blewer
50166200b9 moves resize to width alphabetically 2018-06-06 17:41:38 -04:00
Ashley
f2ec08fd59 Merge pull request #321 from amiaopensource/decoder-details
Decoder details
2018-04-22 13:26:27 -04:00
Ashley Blewer
32004553a6 space fix in ffv1 fixity recipe too 2018-04-22 13:25:34 -04:00
Ashley Blewer
a67b7cc879 rm space 2018-04-22 13:18:34 -04:00
Ashley
b9da657b19 Merge pull request #318 from amiaopensource/rm-google-fonts
removes calls to google fonts CDN
2018-04-22 13:16:33 -04:00
Ashley
91e929dab4 Merge pull request #322 from amiaopensource/updates-contributor-list
Updates contributor list
2018-04-22 13:14:31 -04:00
Ashley Blewer
21e5561dc9 sneaks addition of cable bible into sister projects 2018-04-22 12:58:46 -04:00
Ashley Blewer
36deb1ea62 sub github for code for clarity in both places 2018-04-22 12:55:46 -04:00
Ashley Blewer
89139311f4 updates contributors list, we have grown 2018-04-22 12:55:23 -04:00
Ashley Blewer
fb6581a50e adds back undecided font detail 2018-04-22 12:46:18 -04:00
Ashley Blewer
5bdd6f8d8a adds check decoder errors recipe 2018-04-17 09:56:22 -04:00
Ashley Blewer
3b7ce0e79f moves Check FFV1 alphabetically for section 2018-04-17 09:52:13 -04:00
Ashley
b9b7e0fef9 adds show/hide all button (#319)
resolves https://github.com/amiaopensource/ffmprovisr/issues/211
2018-04-16 21:22:12 +02:00
Ashley Blewer
95e90bb26b clean singular font styling 2018-04-15 09:36:49 -04:00
Ashley Blewer
d70a1de6e1 removes line to google fonts 2018-04-15 09:34:33 -04:00
Ashley Blewer
8417883004 removes calls to google fonts CDN 2018-04-14 20:35:46 -04:00
Reto Kromer
937b9ae525 Merge pull request #317 (add ProRes 4444 XQ) 2018-04-14 20:22:19 +02:00
Reto Kromer
d46138a81b add ProRes 4444 XQ 2018-04-14 17:34:31 +02:00
Reto Kromer
e6317731c9 add missing space 2018-04-14 12:36:03 +02:00
Andrew Weaver
0849bd29e4 rewrap dv codec to .dv (#316) 2018-04-03 19:22:34 +02:00
Ashley
b2d5fcadf3 Merge pull request #315 from amiaopensource/italic
use italic
2018-03-30 11:40:13 -04:00
Reto Kromer
05395f4670 use italic 2018-03-30 10:01:48 +02:00
Ashley
078d20824c Merge pull request #314 from amiaopensource/imagemagick
adds imagemagick section
2018-03-29 13:32:00 -04:00
Ashley Blewer
44c8661e96 subs amp for escaped amp 2018-03-29 13:28:00 -04:00
Ashley Blewer
13bc9bef10 adds imagemagick section 2018-03-29 11:46:02 -04:00
Katherine Frances Nagels
585e0e1f18 Add info on concatenating files of different framerates (#308) 2018-02-18 20:29:35 +01:00
Katherine Frances Nagels
1ef6c3305b Concatenate files of different resolutions (#307) 2018-02-10 09:31:48 +01:00
Katherine Frances Nagels
9c4da4102a Merge pull request #306 from amiaopensource/style
unify coding style
2018-02-10 19:25:31 +13:00
Reto Kromer
c47a7a534f unify coding style 2018-02-10 06:53:13 +01:00
Reto Kromer
4d8fdc9f4e uniform coding style 2018-02-10 06:50:06 +01:00
Reto Kromer
ae590706b0 Merge pull request #305 (Code style: add enclosing quotation marks)
Code style: add enclosing quotation marks
2018-02-10 06:45:22 +01:00
kfrn
e84f0a9fb6 Code style: add enclosing quotation marks 2018-02-10 12:20:21 +13:00
Reto Kromer
e2850d38c0 simplify code (#304) 2018-02-09 21:22:31 +01:00
Reto Kromer
8927478efb Merge pull request #303 (uniform syntax) 2018-02-09 17:06:52 +01:00
Reto Kromer
3c815b1f3b uniform syntax 2018-02-09 16:20:26 +01:00
Ashley
58aa0549ff Merge pull request #301 from amiaopensource/css
replace tabs by spaces
2018-02-05 11:00:11 -05:00
Ashley
4a83b45e7e Merge pull request #302 from amiaopensource/html
fix HTML5
2018-02-05 10:59:59 -05:00
Reto Kromer
f6b44c56ce fix HTML5 2018-02-04 20:58:14 +01:00
Reto Kromer
8149aa163c replace tabs by spaces 2018-02-04 20:45:25 +01:00
Reto Kromer
94f935198f Merge pull request #300 (add alias) 2018-01-25 18:44:17 +01:00
Reto Kromer
c04c9ff12f add alias 2018-01-25 15:55:21 +01:00
Reto Kromer
64787edd4e Merge pull request #299 (Add explanation about input files for join_different_files recipe) 2018-01-25 10:41:06 +01:00
kfrn
f995e8b483 Improve explanation about input files for join_different_files recipe 2018-01-25 18:28:18 +13:00
Katherine Frances Nagels
dea85d1e47 Merge pull request #297 from amiaopensource/uniform_style
uniform style
2018-01-25 07:47:24 +13:00
Reto Kromer
e9fd3fd002 uniform style 2018-01-24 13:16:28 +01:00
Katherine Frances Nagels
debc510205 New recipe: concat files of different types (+ a few fixups) (#296) 2018-01-24 13:10:22 +01:00
7 changed files with 328 additions and 79 deletions

View File

@@ -1,6 +1,7 @@
html, body {
line-height: 1.5;
font-size: 16px;
font-size: 18px;
font-family: sans-serif;
color: #888888;
background-color: #060606;
margin: 0;
@@ -88,9 +89,6 @@ a:visited {
display: inline;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Montserrat', sans-serif;
}
h1 {
letter-spacing: 0.1em;
@@ -111,8 +109,11 @@ h3 {
font-size: 1.5em;
}
h4 {
font-size: 1.2em;
}
.intro-lead {
font-family: 'Montserrat', sans-serif;
font-size: 1em;
}
@@ -161,7 +162,6 @@ img {
}
div {
font-family: 'Merriweather', serif;
color: white;
}
@@ -173,7 +173,6 @@ div {
color: white;
background-color: #383838;
padding: 14px;
font-family: "Montserrat";
letter-spacing: 0.05em;
border: 1px solid black;
cursor: pointer;
@@ -250,17 +249,17 @@ nav .heading {
.hiding {
opacity: 0;
height: 0;
height: 0;
overflow: hidden;
}
input {
position: absolute;
left: -999em
position: absolute;
left: -999em;
}
input[type=checkbox]:checked + div {
opacity: 1;
opacity: 1;
height: auto;
overflow: hidden;
transition: opacity .5s linear, height .5s linear;

View File

@@ -3,7 +3,6 @@
<head>
<title>ffmprovisr</title>
<meta name="viewport" charset="utf-8" content="text/html, width=device-width, initial-scale=1">
<link href="https://fonts.googleapis.com/css?family=Montserrat%7CMerriweather" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="css/css.css">
<link rel="icon" href="img/vhs.ico">
<script src="js/jquery.min.js"></script>
@@ -19,6 +18,7 @@
<nav class="sidebar well">
<h2 class="heading">Table of Contents</h2>
<a href="#about"><div class="contents-list">About this resource</div></a>
<div id="open-all" class="contents-list">Show/hide all recipes</div>
<a href="#basics"><div class="contents-list">FFmpeg basics</div></a>
<a href="#concepts"><div class="contents-list">Advanced FFmpeg concepts</div></a>
<a href="#rewrap"><div class="contents-list">Change container (rewrap)</div></a>
@@ -37,6 +37,8 @@
<a href="#ocr"><div class="contents-list">Use OCR</div></a>
<a href="#perceptual-similarity"><div class="contents-list">Compare similarity of videos</div></a>
<a href="#other"><div class="contents-list">Something else</div></a>
<a href="#similar-tools"><div class="contents-list">Similar tools: tips &amp; tricks</div></a>
<a href="#imagemagick"><div class="contents-list">ImageMagick</div></a>
</nav>
<div class="content">
@@ -45,6 +47,7 @@
<span class="intro-lead">Making FFmpeg Easier</span>
<p>FFmpeg is a powerful tool for manipulating audiovisual files. Unfortunately, it also has a steep learning curve, especially for users unfamiliar with a command line interface. This app helps users through the command generation process so that more people can reap the benefits of FFmpeg.</p>
<p>Each button displays helpful information about how to perform a wide variety of tasks using FFmpeg. To use this site, click on the task you would like to perform. A new window will open up with a sample command and a description of how that command works. You can copy this command and understand how the command works with a breakdown of each of the flags.</p>
<p>This page does not have search functionality, but you can open all recipes (second option in the sidebar) and use your browser's search tool (often ctrl+f or cmd+f) to perform a keyword search through all recipes.</p>
<span class="intro-lead">Tutorials</span>
<p>For FFmpeg basics, check out the programs <a href="https://ffmpeg.org/" target="_blank">official website</a>.</p>
<p>For instructions on how to install FFmpeg on Mac, Linux, and Windows, refer to Reto Kromers <a href="https://avpres.net/FFmpeg/#ch1" target="_blank">installation instructions</a>.</p>
@@ -90,9 +93,9 @@
<h3>Streaming vs. Saving</h3>
<p>FFplay allows you to stream created video and FFmpeg allows you to save video.</p>
<p>The following command creates and saves a 10-second video of SMPTE bars:</p>
<code>ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file</code>
<p><code>ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file</code></p>
<p>This command plays and streams SMPTE bars but does not save them on the computer:</p>
<code>ffplay -f lavfi smptebars=size=640x480</code>
<p><code>ffplay -f lavfi smptebars=size=640x480</code></p>
<p>The main difference is small but significant: the <code>-i</code> flag is required for FFmpeg but not required for FFplay. Additionally, the FFmpeg script needs to have <code>-t 5</code> and <code>output.mkv</code> added to specify the length of time to record and the place to save the video.</p>
<p class="link"></p>
</div>
@@ -113,16 +116,17 @@
<p>It is also possible to apply multiple filters to an input, which are sequenced together in the filtergraph. A chained set of filters is called a filter chain, and a filtergraph may include multiple filter chains. Filters in a filterchain are separated from each other by commas (<code>,</code>), and filterchains are separated from each other by semicolons (<code>;</code>). For example, take the <a href="#inverse-telecine">inverse telecine</a> command:</p>
<p><code>ffmpeg -i <i>input_file</i> -c:v libx264 -vf "fieldmatch,yadif,decimate" <i>output_file</i></code></p>
<p>Here we have a filtergraph including one filter chain, which is made up of three video filters.</p>
<p>It is often prudent to enclose your filtergraph in quotation marks; this means that you can use spaces within the filtergraph. Using the inverse telecine example again, the following filter commands are all valid and equivalent:
<ul>
<li><code>-vf fieldmatch,yadif,decimate</code></li>
<li><code>-vf "fieldmatch,yadif,decimate"</code></li>
<li><code>-vf "fieldmatch, yadif, decimate"</code></li>
</ul>
but <code>-vf fieldmatch, yadif, decimate</code> is not valid.</p>
<p>It is often prudent to enclose your filtergraph in quotation marks; this means that you can use spaces within the filtergraph. Using the inverse telecine example again, the following filter commands are all valid and equivalent:</p>
<ul>
<li><code>-vf fieldmatch,yadif,decimate</code></li>
<li><code>-vf "fieldmatch,yadif,decimate"</code></li>
<li><code>-vf "fieldmatch, yadif, decimate"</code></li>
</ul>
<p>but <code>-vf fieldmatch, yadif, decimate</code> is not valid.</p>
<p>The ordering of the filters is significant. Video filters are applied in the order given, with the output of one filter being passed along as the input to the next filter in the chain. In the example above, <code>fieldmatch</code> reconstructs the original frames from the inverse telecined video, <code>yadif</code> deinterlaces (this is a failsafe in case any combed frames remain, for example if the source mixes telecined and real interlaced content), and <code>decimate</code> deletes duplicated frames. Clearly, it is not possible to delete duplicated frames before those frames are reconstructed.</p>
<h4>Notes</h4>
<ul>
<li><code>-vf</code> is an alias for <code>-filter:v</code></li>
<li>If the command involves more than one input or output, you must use the flag <code>-filter_complex</code> instead of <code>-vf</code>.</li>
<li>Straight quotation marks ("like this") rather than curved quotation marks (“like this”) should be used.</li>
</ul>
@@ -209,6 +213,24 @@
</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">
<div class="hiding">
<h3>Rewrap DV video to .dv file</h3>
<p><code>ffmpeg -i <i>input_file</i> -f rawvideo -c:v copy <i>output_file.dv</i></code></p>
<p>This script will take a video that is encoded in the <a href="https://en.wikipedia.org/wiki/DV" target="_blank">DV Codec</a> but wrapped in a different container (such as MOV) and rewrap it into a raw DV file (with the .dv extension). Since DV files potentially contain a great deal of provenance metadata within the DV stream, it is necessary to rewrap files in this method to avoid unintentional stripping of this metadata.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <i>input_file</i></dt><dd>path and name of the input file</dd>
<dt>-f rawvideo</dt><dd>this tells FFmpeg to pass the video stream as raw video data without remuxing. This step is what ensures the survival of embedded metadata versus a standard rewrap.</dd>
<dt>-c:v copy</dt><dd>copy the DV stream directly, without re-encoding.</dd>
<dt><i>output_file.dv</i></dt><dd>tells FFmpeg to use the DV wrapper for the output.</dd>
</dl>
<p class="link"></p>
</div>
<!-- Rewrap DV -->
</div>
<div class="well">
<h2 id="transcode">Change codec (transcode)</h2>
@@ -239,7 +261,7 @@
<p>FFmpeg comes with more than one ProRes encoder:</p>
<ul>
<li><code>prores</code> is much faster, can be used for progressive video only, and seems to be better for video according to Rec. 601 (Recommendation ITU-R BT.601).</li>
<li><code>prores_ks</code> generates a better file, can also be used for interlaced video, allows also encoding of ProRes 4444 (<code>-c:v prores_ks -profile:v 4</code>), and seems to be better for video according to Rec. 709 (Recommendation ITU-R BT.709).</li>
<li><code>prores_ks</code> generates a better file, can also be used for interlaced video, allows also encoding of ProRes 4444 (<code>-c:v prores_ks -profile:v 4</code>) and ProRes 4444 XQ (<code>-c:v prores_ks -profile:v 5</code>), and seems to be better for video according to Rec. 709 (Recommendation ITU-R BT.709).</li>
</ul>
<p class="link"></p>
</div>
@@ -250,18 +272,19 @@
<input type="checkbox" id="transcode_h264">
<div class="hiding">
<h3>Transcode to H.264</h3>
<p><code>ffmpeg -i <i>input_file</i> -c:v libx264 -pix_fmt yuv420p -c:a copy <i>output_file</i></code></p>
<p><code>ffmpeg -i <i>input_file</i> -c:v libx264 -pix_fmt yuv420p -c:a aac <i>output_file</i></code></p>
<p>This command takes an input file and transcodes it to H.264 with an .mp4 wrapper, keeping the audio the same codec as the original. The libx264 codec defaults to a “medium” preset for compression quality and a CRF of 23. CRF stands for constant rate factor and determines the quality and file size of the resulting H.264 video. A low CRF means high quality and large file size; a high CRF means the opposite.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <i>input_file</i></dt><dd>path, name and extension of the input file</dd>
<dt>-c:v libx264</dt><dd>tells FFmpeg to encode the video stream as H.264</dd>
<dt>-pix_fmt yuv420p</dt><dd>libx264 will use a chroma subsampling scheme that is the closest match to that of the input. This can result in YC<sub>B</sub>C<sub>R</sub> 4:2:0, 4:2:2, or 4:4:4 chroma subsampling. QuickTime and most other non-FFmpeg based players cant decode H.264 files that are not 4:2:0. In order to allow the video to play in all players, you can specify 4:2:0 chroma subsampling.</dd>
<dt>-c:a copy</dt><dd>tells FFmpeg to copy the audio stream without re-encoding it</dd>
<dt>-c:a aac</dt><dd>encode audio as AAC.<br>
AAC is the codec most often used for audio streams within an .mp4 container.</dd>
<dt><i>output_file</i></dt><dd>path, name and extension of the output file</dd>
</dl>
<p>In order to use the same basic command to make a higher quality file, you can add some of these presets:</p>
<p><code>ffmpeg -i <i>input_file</i> -c:v libx264 -pix_fmt yuv420p -preset veryslow -crf 18 -c:a copy <i>output_file</i></code></p>
<p><code>ffmpeg -i <i>input_file</i> -c:v libx264 -pix_fmt yuv420p -preset veryslow -crf 18 -c:a aac <i>output_file</i></code></p>
<dl>
<dt>-preset <i>veryslow</i></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>
@@ -332,7 +355,7 @@
<input type="checkbox" id="dvd_to_file">
<div class="hiding">
<h3>Convert DVD to H.264</h3>
<p><code>ffmpeg -i concat:<i>input_file1</i>\|<i>input_file2</i>\|<i>input_file3</i> -c:v libx264 -c:a copy <i>output_file</i>.mp4</code></p>
<p><code>ffmpeg -i concat:<i>input_file_1</i>\|<i>input_file_2</i>\|<i>input_file_3</i> -c:v libx264 -c:a aac <i>output_file</i>.mp4</code></p>
<p>This command allows you to create an H.264 file from a DVD source that is not copy-protected.</p>
<p>Before encoding, youll need to establish which of the .VOB files on the DVD or .iso contain the content that you wish to encode. Inside the VIDEO_TS directory, you will see a series of files with names like VTS_01_0.VOB, VTS_01_1.VOB, etc. Some of the .VOB files will contain menus, special features, etc, so locate the ones that contain target content by playing them back in VLC.</p>
<dl>
@@ -341,17 +364,18 @@
<code>-i concat:VTS_01_1.VOB\|VTS_01_2.VOB\|VTS_01_3.VOB</code><br>
The backslash is simply an escape character for the pipe (<b>|</b>).</dd>
<dt>-c:v libx264</dt><dd>sets the video codec as H.264</dd>
<dt>-c:a copy</dt><dd>audio remains as-is (no re-encode)</dd>
<dt>-c:a aac</dt><dd>encode audio as AAC.<br>
AAC is the codec most often used for audio streams within an .mp4 container.</dd>
<dt><i>output_file.mp4</i></dt><dd>path and name of the output file</dd>
</dl>
<p>Its also possible to adjust the quality of your output by setting the <b>-crf</b> and <b>-preset</b> values:</p>
<p><code>ffmpeg -i concat:<i>input_file1</i>\|<i>input_file2</i>\|<i>input_file3</i> -c:v libx264 -crf 18 -preset veryslow -c:a copy <i>output_file</i>.mp4</code></p>
<p><code>ffmpeg -i concat:<i>input_file_1</i>\|<i>input_file_2</i>\|<i>input_file_3</i> -c:v libx264 -crf 18 -preset veryslow -c:a aac <i>output_file</i>.mp4</code></p>
<dl>
<dt>-crf 18</dt><dd>sets the constant rate factor to a visually lossless value. Libx264 defaults to a <a href="https://trac.ffmpeg.org/wiki/Encode/H.264#crf" target="_blank">crf of 23</a>, considered medium quality; a smaller CRF value produces a larger and higher quality video.</dd>
<dt>-preset veryslow</dt><dd>A slower preset will result in better compression and therefore a higher-quality file. The default is <b>medium</b>; slower presets are <b>slow</b>, <b>slower</b>, and <b>veryslow</b>.</dd>
</dl>
<p>Bear in mind that by default, libx264 will only encode a single video stream and a single audio stream, picking the best of the options available. To preserve all video and audio streams, add <b>-map</b> parameters:</p>
<p><code>ffmpeg -i concat:<i>input_file1</i>\|<i>input_file2</i> -map 0:v -map 0:a -c:v libx264 -c:a copy <i>output_file</i>.mp4</code></p>
<p><code>ffmpeg -i concat:<i>input_file_1</i>\|<i>input_file_2</i> -map 0:v -map 0:a -c:v libx264 -c:a aac <i>output_file</i>.mp4</code></p>
<dl>
<dt>-map 0:v</dt><dd>encodes all video streams</dd>
<dt>-map 0:a</dt><dd>encodes all audio streams</dd>
@@ -422,7 +446,7 @@
<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>
<p> <code>ffmpeg -i <i>input_file</i> -i <i>input_file_to_append</i> -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 <i>output_file.mp3</i> -map "[concatout]" -codec:a libmp3lame -dither_method modified_e_weighted -qscale:a 2 <i>output_file_appended.mp3</i></code></p>
<p><code>ffmpeg -i <i>input_file</i> -i <i>input_file_to_append</i> -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 <i>output_file.mp3</i> -map "[concatout]" -codec:a libmp3lame -dither_method modified_e_weighted -qscale:a 2 <i>output_file_appended.mp3</i></code></p>
<p>This script allows you to generate two derivative audio files from a master while appending audio from a separate file (for example a copyright or institutional notice) to one of them.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
@@ -880,8 +904,8 @@
<div class="well">
<h2 id="join-trim">Join, trim, or excerpt a video</h2>
<!-- Join files together -->
<label class="recipe" for="join_files">Join (concatenate) two or more files into a single file</label>
<!-- Join files of the same type together -->
<label class="recipe" for="join_files">Join (concatenate) two or more files of the same type</label>
<input type="checkbox" id="join_files">
<div class="hiding">
<h3>Join files together</h3>
@@ -905,7 +929,66 @@
<p>For more information, see the <a href="https://trac.ffmpeg.org/wiki/Concatenate" target="_blank">FFmpeg wiki page on concatenating files</a>.</p>
<p class="link"></p>
</div>
<!-- ends Join files together -->
<!-- ends Join files of the same type together -->
<!-- Join files of different types together -->
<label class="recipe" for="join_different_files">Join (concatenate) two or more files of different types</label>
<input type="checkbox" id="join_different_files">
<div class="hiding">
<h3>Join files together</h3>
<p><code>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]" <i>output_file</i></code></p>
<p>This command takes two or more files of the different file types and joins them together to make a single file.</p>
<p>The input files may differ in many respects - container, codec, chroma subsampling scheme, framerate, etc. However, the above command only works properly if the files to be combined have the same dimensions (e.g., 720x576). Also note that if the input files have different framerates, then the output file will be of variable framerate.</p>
<p>Some aspects of the input files will be normalised: for example, if an input file contains a video track and an audio track that do not have exactly the same duration, the shorter one will be padded. In the case of a shorter video track, the last frame will be repeated in order to cover the missing video; in the case of a shorter audio track, the audio stream will be padded with silence.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <i>input_1.ext</i></dt><dd>path, name and extension of the first input file</dd>
<dt>-i <i>input_2.ext</i></dt><dd>path, name and extension of the second input file</dd>
<dt>-filter_complex</dt><dd>states that a complex filtergraph will be used</dd>
<dt>"</dt><dd>quotation mark to start filtergraph</dd>
<dt>[0:v:0][0:a:0]</dt><dd>selects the first video stream and first audio stream from the first input.<br>
Each reference to a specific stream is enclosed in square brackets. In the first stream reference, <code>0:v:0</code>, the first zero refers to the first input file, <code>v</code> means video stream, and the second zero indicates that it is the <i>first</i> video stream in the file that should be selected. Likewise, <code>0:a:0</code> means the first audio stream in the first input file.<br>
As demonstrated above, ffmpeg uses zero-indexing: <code>0</code> means the first input/stream/etc, <code>1</code> means the second input/stream/etc, and <code>4</code> would mean the fifth input/stream/etc.</dd>
<dt>[1:v:0][1:a:0]</dt><dd>As described above, this means select the first video and audio streams from the second input file.</dd>
<dt>concat=</dt><dd>starts the <code>concat</code> filter</dd>
<dt>n=2</dt><dd>states that there are two input files</dd>
<dt>:</dt><dd>separator</dd>
<dt>v=1</dt><dd>sets the number of output video streams.<br>
Note that this must be equal to the number of video streams selected from each segment.</dd>
<dt>:</dt><dd>separator</dd>
<dt>a=1</dt><dd>sets the number of output audio streams.<br>
Note that this must be equal to the number of audio streams selected from each segment.</dd>
<dt>[video_out]</dt><dd>name of the concatenated output video stream. This is a variable name which you define, so you could call it something different, like “vOut”, “outv”, or “banana”.</dd>
<dt>[audio_out]</dt><dd>name of the concatenated output audio stream. Again, this is a variable name which you define.</dd>
<dt>"</dt><dd>quotation mark to end filtergraph</dd>
<dt>-map "[video_out]"</dt><dd>map the concatenated video stream into the output file by referencing the variable defined above</dd>
<dt>-map "[audio_out]"</dt><dd>map the concatenated audio stream into the output file by referencing the variable defined above</dd>
<dt><i>output_file</i></dt><dd>path, name and extension of the output file</dd>
</dl>
<p>If no characteristics of the output files are specified, ffmpeg will use the default encodings associated with the given output file type. To specify the characteristics of the output stream(s), add flags after each <code>-map "[out]"</code> part of the command.</p>
<p>For example, to ensure that the video stream of the output file is visually lossless H.264 with a 4:2:0 chroma subsampling scheme, the command above could be amended to include the following:<br>
<code>-map "[video_out]" -c:v libx264 -pix_fmt yuv420p -preset veryslow -crf 18</code></p>
<p>Likewise, to encode the output audio stream as mp3, the command could include the following:<br>
<code>-map "[audio_out]" -c:a libmp3lame -dither_method modified_e_weighted -qscale:a 2</code></p>
<h4>Variation: concatenating files of different resolutions</h4>
<p>To concatenate files of different resolutions, you need to resize the videos to have matching resolutions prior to concatenation. The most basic way to do this is by using a scale filter and giving the dimensions of the file you wish to match:</p>
<p><code>-vf scale=1920:1080:flags=lanczos</code></p>
<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]" <i>output_file</i></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><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]" <i>output_file</i></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>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]" <i>output_file</i></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>
<p>For more information, see the <a href="https://trac.ffmpeg.org/wiki/Concatenate#differentcodec" target="_blank">FFmpeg wiki page on concatenating files of different types</a>.</p>
<p class="link"></p>
</div>
<!-- ends Join files of the different types together -->
<!-- Split file into segments -->
<label class="recipe" for="segment_file">Split one file into several smaller segments</label>
@@ -951,7 +1034,7 @@
<dt>-ss 00:02:00</dt><dd>sets in point at 00:02:00</dd>
<dt>-to 00:55:00</dt><dd>sets out point at 00:55:00</dd>
<dt>-c copy</dt><dd>use stream copy mode (no re-encoding)<br>
<dt>-map 0</dt><dd>tells FFmpeg to map all streams of the input to the output.</dd>
<dt>-map 0</dt><dd>tells FFmpeg to map all streams of the input to the output.<br>
<b>Note:</b> 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><i>output_file</i></dt><dd>path, name and extension of the output file</dd>
</dl>
@@ -1036,6 +1119,7 @@
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <i>input_file</i></dt><dd>path, name and extension of the input file</dd>
<dt>-c:v libx264</dt><dd>encodes video stream with libx264 (h264)</dd>
<dt>-filter:v</dt><dd>a video filter will be used</dd>
<dt>"</dt><dd>quotation mark to start filtergraph</dd>
<dt>yadif</dt><dd>deinterlacing filter (yet another deinterlacing filter)<br>
By default, <a href="https://ffmpeg.org/ffmpeg-filters.html#yadif-1" target="_blank">yadif</a> will output one frame for each frame. Outputting one frame for each <i>field</i> (thereby doubling the frame rate) with <code>yadif=1</code> may produce visually better results.</dd>
@@ -1071,7 +1155,7 @@
<dt>"</dt><dd>end of filtergraph</dd>
<dt><i>output file</i></dt><dd>path, name and extension of the output file</dd>
</dl>
<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>
<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><b>Note:</b> 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>
@@ -1626,6 +1710,42 @@
</div>
<!-- ends batch processing (Windows) -->
<!-- Check decoder errors -->
<label class="recipe" for="check_decoder_errors">Check decoder errors</label>
<input type="checkbox" id="check_decoder_errors">
<div class="hiding">
<h3>Check decoder errors</h3>
<p><code>ffmpeg -i <i>input_file</i> -f null -</code></p>
<p>This decodes your video and prints any errors or found issues to the screen.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-i <i>input_file</i></dt><dd>path, name and extension of the input file</dd>
<dt>-f null</dt><dd>Video is decoded with the <code>null</code> muxer. This allows video decoding without creating an output file.</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>
</div>
<!-- ends Check decoder errors -->
<!-- Check FFV1 fixity -->
<label class="recipe" for="check_FFV1_fixity">Check FFV1 fixity</label>
<input type="checkbox" id="check_FFV1_fixity">
<div class="hiding">
<h3>Check FFV1 Version 3 fixity</h3>
<p><code>ffmpeg -report -i <i>input_file</i> -f null -</code></p>
<p>This decodes your video and displays any CRC checksum mismatches. These errors will display in your terminal like this: <code>[ffv1 @ 0x1b04660] CRC mismatch 350FBD8A!at 0.272000 seconds</code></p>
<p>Frame CRCs are enabled by default in FFV1 Version 3.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-report</dt><dd>Dump full command line and console output to a file named <i>ffmpeg-YYYYMMDD-HHMMSS.log</i> in the current directory. It also implies <code>-loglevel verbose</code>.</dd>
<dt>-i <i>input_file</i></dt><dd>path, name and extension of the input file</dd>
<dt>-f null</dt><dd>Video is decoded with the <code>null</code> muxer. This allows video decoding without creating an output file.</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>
</div>
<!-- ends Check FFV1 Fixity -->
<!-- Create frame md5s -->
<label class="recipe" for="create_frame_md5s_v">Create MD5 checksums (video frames)</label>
<input type="checkbox" id="create_frame_md5s_v">
@@ -1744,25 +1864,6 @@
</div>
<!-- ends QCTools Report (no audio) -->
<!-- Check FFV1 fixity -->
<label class="recipe" for="check_FFV1_fixity">Check FFV1 fixity</label>
<input type="checkbox" id="check_FFV1_fixity">
<div class="hiding">
<h3>Check FFV1 Version 3 fixity</h3>
<p><code>ffmpeg -report -i <i>input_file</i> -f null -</code></p>
<p>This decodes your video and displays any CRC checksum mismatches. These errors will display in your terminal like this: <code>[ffv1 @ 0x1b04660] CRC mismatch 350FBD8A!at 0.272000 seconds</code></p>
<p>Frame CRCs are enabled by default in FFV1 Version 3.</p>
<dl>
<dt>ffmpeg</dt><dd>starts the command</dd>
<dt>-report</dt><dd>Dump full command line and console output to a file named <i>ffmpeg-YYYYMMDD-HHMMSS.log</i> in the current directory. It also implies <code>-loglevel verbose</code>.</dd>
<dt>-i <i>input_file</i></dt><dd>path, name and extension of the input file</dd>
<dt>-f null</dt><dd>Video is decoded with the <code>null</code> muxer. This allows video decoding without creating an output file.</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>
</div>
<!-- ends Check FFV1 Fixity -->
<!-- Read/Extract EIA-608 Closed Captions -->
<label class="recipe" for="readeia608">Read/Extract EIA-608 Closed Captioning</label>
<input type="checkbox" id="readeia608">
@@ -1942,7 +2043,7 @@
<input type="checkbox" id="game_of_life">
<div class="hiding">
<h3>Conway's Game of Life</h3>
<p>Simulates <a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Conway's Game of Life</a></p>
<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>
<dl>
<dt>ffplay</dt><dd>starts the command</dd>
@@ -2246,6 +2347,138 @@
</div>
<!-- ends View Subprogram info -->
</div>
<div class="well">
<h2 id="similar-tools">Similar tools: tips &amp; tricks 🎩🐰</h2>
<div class="well">
<p>This section introduces and explains the usage of some additional command line tools similar to FFmpeg for use in digital preservation workflows (and beyond!).</p>
</div>
</div>
<div class="well">
<h2 id="imagemagick">ImageMagick</h2>
<!-- About ImageMagick -->
<label class="recipe" for="im-basics">About ImageMagick</label>
<input type="checkbox" id="im-basics">
<div class="hiding">
<h3>About ImageMagick</h3>
<p>ImageMagick is a free and open-source software suite for displaying, converting, and editing raster image and vector image files.</p>
<p>It's official website can be found <a href="https://www.imagemagick.org/script/index.php" target="_blank">here</a>.</p>
<p>Another great resource with lots of supplemental explanations of filters is available at <a href="http://www.fmwconcepts.com/imagemagick/index.php" target="_blank">Fred's ImageMagick Scripts</a>.</p>
<p>Unlike many other command line tools, ImageMagick isn't summoned by calling its name. Rather, ImageMagick installs links to several more specific commands: <code>convert</code>, <code>montage</code>, and <code>mogrify</code>, to name a few.</p>
<p class="link"></p>
</div>
<!-- End About ImageMagick -->
<!-- Compare two images -->
<label class="recipe" for="im_compare">Compare two images</label>
<input type="checkbox" id="im_compare">
<div class="hiding">
<h3>Compare two images</h3>
<p><code>compare -metric ae <i>image1.ext image2.ext</i> null:</code></p>
<p>Compares two images to each other.</p>
<dl>
<dt>compare</dt><dd>starts the command</dd>
<dt>-metric ae</dt><dd>applies the absolute error count metric, returning the number of different pixels. <a href="https://www.imagemagick.org/script/command-line-options.php#metric" target="_blank">Other parameters</a> are available for image comparison.</dd>
<dt><i>image1.ext image2.ext</i></dt><dd>takes two images as input</dd>
<dt>null:</dt><dd>throws away the comparison image that would be generated</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Compare two images -->
<!-- Create thumbnails -->
<label class="recipe" for="im_thumbs">Create thumbnails of images</label>
<input type="checkbox" id="im_thumbs">
<div class="hiding">
<h3>Create thumbnails</h3>
<p>Creates thumbnails for all files in a folder and saves them in that folder.</p>
<p><code>mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg</code></p>
<dl>
<dt>montage</dt><dd>starts the command</dd>
<dt>-resize 80x80</dt><dd>resizes copies of original images to 80x80 pixels</dd>
<dt>-format jpg</dt><dd>reformats original images to jpg</dd>
<dt>-quality 75</dt><dd>sets quality to 75 (out of 100), adding light compression to smaller files</dd>
<dt>-path thumbs</dt><dd>specifies where to save the thumbnails -- this goes to a folder within the active folder called "thumbs".<br>
Note: You will have to make this folder if it doesn't already exist.</dd>
<dt><i>*.jpg</i></dt><dd>The astericks acts as a "wildcard" to be applied to every file in the directory.</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Create thumbnails -->
<!-- Create grid of images -->
<label class="recipe" for="im_grid">Creates grid of images from text file</label>
<input type="checkbox" id="im_grid">
<div class="hiding">
<h3>Create grid of images</h3>
<p><code>montage @<i>list.txt</i> -tile 6x12 -geometry +0+0 <i>output_grid.jpg</i></code></p>
<dl>
<dt>montage</dt><dd>starts the command</dd>
<dt>@list.txt</dt><dd>path and name of a text file containing a list of filenames, one per each line</dd>
<dt>-tile 6x12</dt><dd>specifies the dimensions of the proposed grid (6 images wide, 12 images long)</dd>
<dt>-geometry +0+0</dt><dd>specifies to include no spacing around any of the tiles; they will be flush against each other</dd>
<dt><i>output_grid.jpg</i></dt><dd>path and name of the output file</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Create grid of images -->
<!-- Get file signature data -->
<label class="recipe" for="im_sig_data">Get file signature data</label>
<input type="checkbox" id="im_sig_data">
<div class="hiding">
<h3>Get file signature data</h3>
<p><code>convert -verbose <i>input_file.ext</i> | grep -i signature </code></p>
<p>Gets signature data from an image file, which is a hash that can be used to uniquely identify the image.</p>
<dl>
<dt>convert</dt><dd>starts the command</dd>
<dt>-verbose</dt><dd>sets verbose flag for collecting the most data</dd>
<dt><i>input_file.ext</i></dt><dd>path and name of image file</dd>
<dt>|</dt><dd>pipe the data into something else</dd>
<dt>grep</dt><dd>starts the grep command</dd>
<dt>-i signature</dt><dd>ignore case and search for the phrase "signature"</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Get file signature data -->
<!-- Remove exif data -->
<label class="recipe" for="im_strip">Removes exif metadata</label>
<input type="checkbox" id="im_strip">
<div class="hiding">
<h3>Remove exif data</h3>
<p><code>mogrify -path ./stripped/ -strip *.jpg</code></p>
<p>Removes (strips) exif data and moves clean files to a new folder.</p>
<dl>
<dt>mogrify</dt><dd>starts the command</dd>
<dt>-path ./stripped/</dt><dd>sets directory within current directory called "stripped"</dd>
<dt>-strip</dt><dd>removes exif metadata</dd>
<dt>*.jpg</dt><dd>applies command to all .jpgs in current folder</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Remove exif data -->
<!-- Resize to width -->
<label class="recipe" for="im_resize">Resizes image to specific pixel width</label>
<input type="checkbox" id="im_resize">
<div class="hiding">
<h3>Resize to width</h3>
<p><code>convert <i>input_file.ext</i> -resize 750 <i>output_file.ext</i></code></p>
<p>This script will also convert the file format, if the output has a different file extension than the input.</p>
<dl>
<dt>convert</dt><dd>starts the command</dd>
<dt>-i <i>input_file.ext</i></dt><dd>path and name of the input file</dd>
<dt>-resize 750</dt><dd>resizes the image to 750 pixels wide, retaining aspect ratio</dd>
<dt><i>output_file.ext</i></dt><dd>path and name of the output file</dd>
</dl>
<p class="link"></p>
</div>
<!-- ends Resize to width -->
</div>
</div><!-- ends "content" -->
<!-- sample example -->
@@ -2266,7 +2499,7 @@ Change the above data-target field, the hover-over description, the button text,
<!-- ends sample example -->
<footer class="footer">
<p>Made with ♥ at <a href="https://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_%26_Digital_Library_Federation_Hack_Day_2015" target="_blank">AMIA #AVhack15</a>! Contribute to the project via <a href="https://github.com/amiaopensource/ffmprovisr">our GitHub page</a>!</p>
<p>Made with ♥ at <a href="https://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_%26_Digital_Library_Federation_Hack_Day_2015" target="_blank">AMIA #AVhack15</a>! Contribute to the project via <a href="https://github.com/amiaopensource/ffmprovisr" target="_blank">our GitHub page</a>!</p>
</footer>
</div><!-- ends "grid" -->
</body>

View File

@@ -18,4 +18,10 @@ $(document).ready(function() {
$('#' + 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>");
});
$('#open-all').on("click", function(){
$('input[type=checkbox]').each(function(){
this.checked = !this.checked;
})
});
});

View File

@@ -49,10 +49,13 @@ You can read our contributor code of conduct [here](https://github.com/amiaopens
## Contributors
* Gathered using [octohatrack](https://github.com/LABHR/octohatrack)
*GitHub Contributors*:
*Code Contributors*:
ablwr (Ashley)
bastibeckr (Basti Becker)
bturkus
dericed (Dave Rice)
edsu (Ed Summers)
jamessam (Jim Sam)
jfarbowitz (Jonathan Farbowitz)
kfrn (Katherine Frances Nagels)
kgrons (Kathryn Gronsbell)
@@ -62,17 +65,23 @@ pjotrek-b (Peter B.)
privatezero (Andrew Weaver)
retokromer (Reto Kromer)
rfraimow
*All Contributors*:
*All Contributors*:
ablwr (Ashley)
audiovisualopen
bastibeckr (Basti Becker)
brainwane (Sumana Harihareswara)
bturkus
dericed (Dave Rice)
drodz11 (Dave Rodriguez)
edsu (Ed Summers)
EG-tech (Ethan Gates)
federicomenaquintero (Federico Mena Quintero)
Fizz24
GregH18
jamessam (Jim Sam)
jfarbowitz (Jonathan Farbowitz)
JonnyTech
jronallo (Jason Ronallo)
kellyhaydon (metacynic)
kfrn (Katherine Frances Nagels)
@@ -80,16 +89,19 @@ kgrons (Kathryn Gronsbell)
kieranjol (Kieran O'Leary)
llogan (Lou)
mulvya
nkrabben (Nick Krabbenhoeft)
pjotrek-b (Peter B.)
privatezero (Andrew Weaver)
retokromer (Reto Kromer)
rfraimow
richardpl (Paul B Mahol)
ross-spencer (Ross Spencer)
todrobbins (Tod Robbins)
Repo: amiaopensource/ffmprovisr
GitHub Contributors: 12
All Contributors: 22
Code Contributors: 15
All Contributors: 30
Last updated: 2018-04-22 (4:2:2 Day)
## AVHack Team
@@ -99,6 +111,7 @@ All Contributors: 22
## Sister projects
[The Cable Bible](https://amiaopensource.github.io/cable-bible/): A Guide to Cables and Connectors Used for Audiovisual Tech
[Script Ahoy](http://dd388.github.io/crals/): Community Resource for Archivists and Librarians Scripting
[sourcecaster](https://datapraxis.github.io/sourcecaster/): helps you use the command line to work through common challenges that come up when working with digital primary sources.

View File

@@ -1,12 +1,12 @@
#!/usr/bin/env bash
SCRIPT=$(basename "${0}")
VERSION='2017-07-08'
AUTHOR='ffmprovisr'
RED='\033[1;31m'
BLUE='\033[1;34m'
NC='\033[0m'
VERSION="2018-02-10"
AUTHOR="ffmprovisr"
RED="\033[1;31m"
BLUE="\033[1;34m"
NC="\033[0m"
if [[ "${OSTYPE}" = "cygwin" ]] || [ ! $(which diff) ]; then
if [[ "${OSTYPE}" = "cygwin" ]] || [[ ! "$(which diff)" ]]; then
echo -e "${RED}Error: 'diff' is not installed by default. Please install 'diffutils' from Cygwin.${NC}"
exit 1
fi
@@ -67,9 +67,8 @@ old_file=$(grep -v '^#' "${input_hash}")
tmp_file=$(grep -v '^#' "${md5_tmp}")
if [[ "${old_file}" = "${tmp_file}" ]]; then
echo -e "${BLUE}'$(basename "${input_file}")' matches '$(basename "${input_hash}")'${NC}"
rm "${md5_tmp}"
else
echo -e "${RED}The following differences were detected between '$(basename "${input_file}")' and '$(basename "${input_hash}")':${NC}"
diff "${input_hash}" "${md5_tmp}"
rm "${md5_tmp}"
fi
rm "${md5_tmp}"

View File

@@ -1,12 +1,12 @@
#!/usr/bin/env bash
SCRIPT=$(basename "${0}")
VERSION='2017-07-08'
AUTHOR='ffmprovisr'
RED='\033[1;31m'
BLUE='\033[1;34m'
NC='\033[0m'
VERSION="2018-02-10"
AUTHOR="ffmprovisr"
RED="\033[1;31m"
BLUE="\033[1;34m"
NC="\033[0m"
if [[ "${OSTYPE}" = "cygwin" ]] || [ ! $(which diff) ]; then
if [[ "${OSTYPE}" = "cygwin" ]] || [[ ! "$(which diff)" ]]; then
echo -e "${RED}Error: 'diff' is not installed by default. Please install 'diffutils' from Cygwin.${NC}"
exit 1
fi
@@ -64,9 +64,8 @@ old_file=$(grep -v '^#' "${input_hash}")
tmp_file=$(grep -v '^#' "${md5_tmp}")
if [[ "${old_file}" = "${tmp_file}" ]]; then
echo -e "${BLUE}'$(basename "${input_file}")' matches '$(basename "${input_hash}")'${NC}"
rm "${md5_tmp}"
else
echo -e "${RED}The following differences were detected between '$(basename "${input_file}")' and '$(basename "${input_hash}")':${NC}"
diff "${input_hash}" "${md5_tmp}"
rm "${md5_tmp}"
fi
rm "${md5_tmp}"

View File

@@ -10,7 +10,7 @@ if [[ "$(uname -s)" = "Darwin" ]] ; then
else
ffmprovisr_path=$(find /usr/local/Cellar/ffmprovisr -iname 'index.html' | sort -M | tail -n1)
fi
if [ -n "${default_browser}" ] ; then
if [[ -n "${default_browser}" ]] ; then
open -b "${default_browser}" "${ffmprovisr_path}"
else
open "${ffmprovisr_path}"