mirror of
https://github.com/amiaopensource/ffmprovisr.git
synced 2025-10-10 15:59:57 +02:00
Compare commits
209 Commits
v2018-04-0
...
v2020-05-1
Author | SHA1 | Date | |
---|---|---|---|
|
3984c8aae3 | ||
|
f9ef8dbae3 | ||
|
f814abbc0a | ||
|
843f05cc73 | ||
|
54577f4b28 | ||
|
aa5d63f4c4 | ||
|
dd257331fe | ||
|
feac0ded9b | ||
|
a33ed1d24f | ||
|
020b9fbe73 | ||
|
1df442f6dd | ||
|
3a05c8f440 | ||
|
89642fdd56 | ||
|
a9ec972aef | ||
|
91540a2fb8 | ||
|
2becad3d9c | ||
|
e4c327bbac | ||
|
4359d6dd4a | ||
|
d184ed2fe9 | ||
|
089725a753 | ||
|
897f1b1616 | ||
|
358a2ec23b | ||
|
de6c08a58d | ||
|
0d1fc1bfe8 | ||
|
cbca3ac7ad | ||
|
bcc425a955 | ||
|
0353c1761e | ||
|
e3aa81fb95 | ||
|
633374f22d | ||
|
1d60060eed | ||
|
6cfe7f7a47 | ||
|
fc63116e2f | ||
|
f74f0cde93 | ||
|
832026b57c | ||
|
db330a3a0c | ||
|
c88008a68f | ||
|
b45b2d79e1 | ||
|
e95d915869 | ||
|
059faba357 | ||
|
614b28fd9a | ||
|
e51199bc53 | ||
|
c1aff3fd69 | ||
|
ca0f2a8d0a | ||
|
640672b6f6 | ||
|
84c6f127a2 | ||
|
d180012261 | ||
|
6d9d4fc596 | ||
|
4e0e369bbb | ||
|
96b221642f | ||
|
309a8e7c8d | ||
|
9c3c807af0 | ||
|
aee386d889 | ||
|
6267c1c19a | ||
|
5a1aee1cf2 | ||
|
46fad11207 | ||
|
782b1a992a | ||
|
9f6e6846e0 | ||
|
c4bd6a9191 | ||
|
8b48abf751 | ||
|
54aab85937 | ||
|
51ca7a4200 | ||
|
76c3fe1f88 | ||
|
839d50111e | ||
|
a6dd9c203c | ||
|
3402d968a7 | ||
|
283756f8cf | ||
|
d28ae29f5c | ||
|
2be5576012 | ||
|
43c98527a7 | ||
|
164d757309 | ||
|
2a87a120c3 | ||
|
fbe5f216a7 | ||
|
f93922a9c3 | ||
|
e06a76f559 | ||
|
0279c1d842 | ||
|
7e72b1c254 | ||
|
07fe8bf966 | ||
|
c32a7f44ad | ||
|
ea2c29a38c | ||
|
d624a3fc11 | ||
|
ade2615da3 | ||
|
72545d5c31 | ||
|
c6215c1953 | ||
|
abfb9ea982 | ||
|
02beb6ab1d | ||
|
b552ec4a31 | ||
|
c26c0d57ea | ||
|
d023bf7500 | ||
|
5b795e53dd | ||
|
806fd0c49b | ||
|
8a2cdbc088 | ||
|
9df208345c | ||
|
19e38145dd | ||
|
7453e500df | ||
|
8ceb0f4fc6 | ||
|
d95c2e6aa1 | ||
|
ef82e43fb8 | ||
|
445bd681a0 | ||
|
c01f821b59 | ||
|
47575a57ed | ||
|
2d6bf9159f | ||
|
60d452a431 | ||
|
dbd7687fb4 | ||
|
193d5f30fb | ||
|
7ad290734e | ||
|
9686a76ed6 | ||
|
2dee34d429 | ||
|
6daace9149 | ||
|
01a7404ece | ||
|
1062f8cf36 | ||
|
65161a567e | ||
|
c78323d8e7 | ||
|
afac0cda74 | ||
|
cc188eaf07 | ||
|
2f2ba5e6f1 | ||
|
c6021ea19b | ||
|
7a4ae9d2ea | ||
|
6b99821230 | ||
|
ed8c09daa6 | ||
|
c0181f51f8 | ||
|
1aeb95468d | ||
|
a3005e42d3 | ||
|
3934d85f54 | ||
|
f771ff3816 | ||
|
db219e201c | ||
|
a727aa7d5c | ||
|
5f7a01e920 | ||
|
76a93b7211 | ||
|
e431fbb3c5 | ||
|
14e66c13db | ||
|
2d14e3266b | ||
|
7615c872e4 | ||
|
de039c667b | ||
|
b2233fe170 | ||
|
6d74c84cc5 | ||
|
4caca0a698 | ||
|
6ec07fd3dd | ||
|
5e059adfb2 | ||
|
06501bc8bd | ||
|
ac4a14c54f | ||
|
dbf59f919a | ||
|
4e75f3f540 | ||
|
387876676d | ||
|
05e2775d49 | ||
|
ba1d2757c6 | ||
|
150faff29d | ||
|
ff1871273f | ||
|
36da6d3e79 | ||
|
d00d9f91de | ||
|
a948b1519b | ||
|
33d3a4d10d | ||
|
b88cbbd248 | ||
|
982a1a6525 | ||
|
ec5e7621b5 | ||
|
6a0a70d1d5 | ||
|
6b24940df1 | ||
|
e08ec96fd9 | ||
|
42cacd8414 | ||
|
d6ab2d63bb | ||
|
c3ff180189 | ||
|
ac22e3e361 | ||
|
963e0591e5 | ||
|
1bf462820e | ||
|
98fe0c5b67 | ||
|
8ee96228bc | ||
|
738ceabfe6 | ||
|
52dd44778f | ||
|
2f7b390f9b | ||
|
d5e13458eb | ||
|
493489517f | ||
|
71ae32541f | ||
|
e7b18b8fd4 | ||
|
dde92c2b4e | ||
|
05eb182352 | ||
|
c9660d3c7b | ||
|
7398b7f25e | ||
|
a6bb255817 | ||
|
67b34592e4 | ||
|
04037bda1e | ||
|
dc633dfa8d | ||
|
1b890fd630 | ||
|
0d12f57720 | ||
|
0e2e90e72b | ||
|
6e9d9c9a29 | ||
|
8810d40523 | ||
|
1ebea5cf19 | ||
|
ec3829d1b6 | ||
|
468b7b3a09 | ||
|
7ecd3214d5 | ||
|
50166200b9 | ||
|
f2ec08fd59 | ||
|
32004553a6 | ||
|
a67b7cc879 | ||
|
b9da657b19 | ||
|
91e929dab4 | ||
|
21e5561dc9 | ||
|
36deb1ea62 | ||
|
89139311f4 | ||
|
fb6581a50e | ||
|
5bdd6f8d8a | ||
|
3b7ce0e79f | ||
|
b9b7e0fef9 | ||
|
95e90bb26b | ||
|
d70a1de6e1 | ||
|
8417883004 | ||
|
937b9ae525 | ||
|
d46138a81b | ||
|
e6317731c9 | ||
|
0849bd29e4 |
@@ -43,8 +43,8 @@ incident.
|
||||
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 1.3.0, available at
|
||||
[http://contributor-covenant.org/version/1/3/0/][version]
|
||||
version 1.4.1, available at
|
||||
[https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/3/0/
|
||||
[homepage]: https://www.contributor-covenant.org/
|
||||
[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
11
css/css.css
11
css/css.css
@@ -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;
|
||||
@@ -107,7 +105,7 @@ h2 {
|
||||
margin: 6px 0px 12px 0px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
h3, h5 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
@@ -116,7 +114,6 @@ h4 {
|
||||
}
|
||||
|
||||
.intro-lead {
|
||||
font-family: 'Montserrat', sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
@@ -165,7 +162,6 @@ img {
|
||||
}
|
||||
|
||||
div {
|
||||
font-family: 'Merriweather', serif;
|
||||
color: white;
|
||||
}
|
||||
|
||||
@@ -177,7 +173,6 @@ div {
|
||||
color: white;
|
||||
background-color: #383838;
|
||||
padding: 14px;
|
||||
font-family: "Montserrat";
|
||||
letter-spacing: 0.05em;
|
||||
border: 1px solid black;
|
||||
cursor: pointer;
|
||||
|
1529
index.html
1529
index.html
File diff suppressed because it is too large
Load Diff
4
js/jquery.min.js
vendored
4
js/jquery.min.js
vendored
File diff suppressed because one or more lines are too long
109
js/js.js
109
js/js.js
@@ -1,21 +1,96 @@
|
||||
$(document).ready(function() {
|
||||
function scrollTo(element, to, duration) {
|
||||
var start = element.scrollTop,
|
||||
change = to - start,
|
||||
currentTime = 0,
|
||||
increment = 20;
|
||||
|
||||
// open recipe window if a hash is found in URL
|
||||
if(window.location.hash) {
|
||||
id = window.location.hash
|
||||
console.log(id.substring(1))
|
||||
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>");
|
||||
var animateScroll = function(){
|
||||
currentTime += increment;
|
||||
var val = Math.easeInOutQuad(currentTime, start, change, duration);
|
||||
element.scrollTop = val;
|
||||
if(currentTime < duration) {
|
||||
setTimeout(animateScroll, increment);
|
||||
}
|
||||
}
|
||||
animateScroll()
|
||||
}
|
||||
|
||||
// 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>");
|
||||
});
|
||||
//t = current time, b = start value, c = change in value, d = duration
|
||||
Math.easeInOutQuad = function (t, b, c, d) {
|
||||
t /= d/2;
|
||||
if (t < 1) return c/2*t*t + b;
|
||||
t--;
|
||||
return -c/2 * (t*(t-2) - 1) + b;
|
||||
}
|
||||
|
||||
function appendLink(id) {
|
||||
const link = document.getElementById(id).nextElementSibling.querySelector('.link')
|
||||
if (link) {
|
||||
link.innerHTML = ("<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).checked = true;
|
||||
scrollTo(document.body, 0, 1000);
|
||||
appendLink(id)
|
||||
}
|
||||
|
||||
// open recipe window if a hash is found in URL
|
||||
if (window.location.hash) {
|
||||
id = window.location.hash.slice(1)
|
||||
moveToRecipe(id)
|
||||
}
|
||||
|
||||
// add hash URL when recipe is opened
|
||||
const recipes = document.querySelectorAll('label[class="recipe"]')
|
||||
recipes.forEach(function(item, i){
|
||||
item.addEventListener("click", function(){
|
||||
id = this.getAttribute("for");
|
||||
window.location.hash = (id)
|
||||
appendLink(id)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
// open recipe when clicked
|
||||
const links = document.querySelectorAll('a')
|
||||
links.forEach(function(item, i){
|
||||
|
||||
item.addEventListener("click", function(){
|
||||
intralink = this.getAttribute("href")
|
||||
if (intralink[0] == "#") {
|
||||
moveToRecipe(intralink.substring(1))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
function getCheckedBoxes(checkboxes) {
|
||||
var checkboxesChecked = [];
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
if (checkboxes[i].checked) {
|
||||
checkboxesChecked.push(checkboxes[i]);
|
||||
}
|
||||
}
|
||||
return checkboxesChecked.length > 0 ? checkboxesChecked : null;
|
||||
}
|
||||
|
||||
// Collapse all recipes when button is clicked
|
||||
document.getElementById('toggle-expand-collapse-all').addEventListener("click", function(){
|
||||
const checkboxes = document.querySelectorAll('input[type=checkbox]')
|
||||
var checked = getCheckedBoxes(checkboxes);
|
||||
|
||||
if (checked) {
|
||||
// Collapse all
|
||||
document.querySelectorAll('input[type=checkbox]').forEach(function(item, i){
|
||||
item.checked = false;
|
||||
})
|
||||
} else {
|
||||
// Expand all
|
||||
document.querySelectorAll('input[type=checkbox]').forEach(function(item, i){
|
||||
item.checked = true;
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
|
86
readme.md
86
readme.md
@@ -2,6 +2,17 @@
|
||||
|
||||
Repository of useful FFmpeg command lines for archivists!
|
||||
|
||||
* [What is this?](#what-is-this)
|
||||
* [How do I see it?](#how-do-i-see-it)
|
||||
* [How do I contribute?](#how-do-i-contribute)
|
||||
* [Code of conduct](#code-of-conduct)
|
||||
* [Maintainers](#maintainers)
|
||||
* [Contributors](#contributors)
|
||||
* [AVHack Team](#avhack-team)
|
||||
* [Sister projects](#sister-projects)
|
||||
* [Articles and mentions](#articles-and-mentions)
|
||||
* [License](#license)
|
||||
|
||||
## What is this?
|
||||
|
||||
#### Project Objective
|
||||
@@ -12,15 +23,36 @@ 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:
|
||||
```
|
||||
ffmprovisr
|
||||
```
|
||||
This works currently under macOS, Linux and the Linux subsystem on Windows. On classic Windows you can install the last [release](https://github.com/amiaopensource/ffmprovisr/releases) manually and the open `index.html` in a browser.
|
||||
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?
|
||||
|
||||
@@ -44,52 +76,76 @@ You can read our contributor code of conduct [here](https://github.com/amiaopens
|
||||
|
||||
## Maintainers
|
||||
|
||||
[Ashley Blewer](https://github.com/ablwr), [Katherine Frances Nagels](https://github.com/kfrn), [Kieran O'Leary](https://github.com/kieranjol), [Reto Kromer](https://github.com/retokromer) and [Andrew Weaver](https://github.com/privatezero)
|
||||
[Ashley Blewer](https://github.com/ablwr), [Katherine Frances Nagels](https://github.com/kfrn), [Kieran O'Leary](https://github.com/kieranjol) and [Andrew Weaver](https://github.com/privatezero)
|
||||
|
||||
## Contributors
|
||||
* Gathered using [octohatrack](https://github.com/LABHR/octohatrack)
|
||||
|
||||
*GitHub Contributors*:
|
||||
*Code Contributors*:
|
||||
ablwr (Ashley)
|
||||
alavigne12 (A. Lavigne)
|
||||
Anushka-codergirl (Anushka Raj)
|
||||
bastibeckr (Basti Becker)
|
||||
bturkus
|
||||
dericed (Dave Rice)
|
||||
digitensions (Joanna White)
|
||||
edsu (Ed Summers)
|
||||
jamessam (Jim Sam)
|
||||
jfarbowitz (Jonathan Farbowitz)
|
||||
kfrn (Katherine Frances Nagels)
|
||||
kgrons (Kathryn Gronsbell)
|
||||
kieranjol (Kieran O'Leary)
|
||||
llogan (Lou)
|
||||
llogan (Lou Logan)
|
||||
macasaurusrex (Maura)
|
||||
mgiraldo (Mauricio Giraldo)
|
||||
pjotrek-b (Peter B.)
|
||||
privatezero (Andrew Weaver)
|
||||
retokromer (Reto Kromer)
|
||||
rfraimow
|
||||
|
||||
*All Contributors*:
|
||||
All Contributors:
|
||||
ablwr (Ashley)
|
||||
alavigne12 (A. Lavigne)
|
||||
Anushka-codergirl (Anushka Raj)
|
||||
audiovisualopen
|
||||
bastibeckr (Basti Becker)
|
||||
brainwane (Sumana Harihareswara)
|
||||
bturkus
|
||||
dericed (Dave Rice)
|
||||
digitensions (Joanna White)
|
||||
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)
|
||||
kgrons (Kathryn Gronsbell)
|
||||
kieranjol (Kieran O'Leary)
|
||||
llogan (Lou)
|
||||
llogan (Lou Logan)
|
||||
macasaurusrex (Maura)
|
||||
mercuryswitch
|
||||
mgiraldo (Mauricio Giraldo)
|
||||
mulvya
|
||||
nkrabben (Nick Krabbenhoeft)
|
||||
pjotrek-b (Peter B.)
|
||||
privatezero (Andrew Weaver)
|
||||
retokromer (Reto Kromer)
|
||||
rfraimow
|
||||
richardpl (Paul B Mahol)
|
||||
ross-spencer (Ross Spencer)
|
||||
taschenbach (Tommy Aschenbach)
|
||||
todrobbins (Tod Robbins)
|
||||
|
||||
Repo: amiaopensource/ffmprovisr
|
||||
GitHub Contributors: 12
|
||||
All Contributors: 22
|
||||
GitHub Contributors: 20
|
||||
All Contributors: 37
|
||||
Last updated: 2019-12-11
|
||||
|
||||
## AVHack Team
|
||||
|
||||
@@ -99,9 +155,19 @@ All Contributors: 22
|
||||
|
||||
## Sister projects
|
||||
|
||||
[The Cable Bible](https://amiaopensource.github.io/cable-bible/): A Guide to Cables and Connectors Used for Audiovisual Tech
|
||||
[QEMU QED](https://eaasi.gitlab.io/qemu-qed): instructions for using QEMU (Quick EMUlator), a command line application for computer emulation and virtualization
|
||||
[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.
|
||||
|
||||
## Articles and mentions
|
||||
|
||||
* 2019-09: **Andrew Weaver & Ashley Blewer**, [Sustainability through community: ffmprovisr and the Case for Collaborative Knowledge Transfer](https://ipres2019.org/static/pdf/iPres2019_paper_97.pdf) (PDF), iPRES 2019
|
||||
- Andrew Weaver [won](https://twitter.com/iPRES2019/status/1177136202144768000) iPres' Best First Time Contribution Award for his work on this paper :)
|
||||
* 2018-11: ffmprovisr is mentioned in [a job advert](http://web.library.emory.edu/documents/pa_staff_Audiovisual%20Conservator_Nov2018.pdf)!
|
||||
* 2017-10: **Ashley Blewer & Katherine Nagels**, [ffmprovisr gets a redesign](https://bits.ashleyblewer.com/blog/2017/10/31/ffmprovisr-redesign/)
|
||||
* 2015-11: **AMIA & DLF Hack Day 2015**, [ffmprovsr](https://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_&_Digital_Library_Federation_Hack_Day_2015#ffmprovsr) - the genesis of ffmprovisr (then spelled without the 'i')
|
||||
|
||||
## License
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/80x15.png"></a><br>
|
||||
|
216
recipes.txt
Normal file
216
recipes.txt
Normal file
@@ -0,0 +1,216 @@
|
||||
# Basic rewrap command
|
||||
ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
|
||||
# Generate Broadcast WAV
|
||||
ffmpeg -i input_file.wav -c copy -write_bext 1 -metadata field_name='Content' output_file.wav
|
||||
# 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 triangular -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 triangular -qscale:a 2 output_file.mp3 -map "[concatout]" -codec:a libmp3lame -dither_method triangular -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 triangular -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
|
||||
# Fade both video and audio streams
|
||||
ffmpeg -i input_file -filter:v "fade=in:st=0:d=1, fade=out:st=59:d=1" -filter:a "afade=in:st=0:d=1, afade=out:st=59:d=1" -c:v libx264 -c:a aac 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 -
|
||||
# Get individual checksums for all video/audio streams ("Streamhash")
|
||||
ffmpeg -i input_file -map 0 -f streamhash -hash md5 - -v quiet
|
||||
# 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
1
scripts/get_recipe_list
Normal file
@@ -0,0 +1 @@
|
||||
curl https://amiaopensource.github.io/ffmprovisr/ -s | grep -E '<h5>.*</h5>|<p><code>.*</code></p>' | sed 's/.*<code>\(.*\)<\/code>/\1/' | sed 's/.*<h5>\(.*\)<\/h5>/# \1/' | grep -v '\*\*\*' | sed -e 's/<[^>]*>//g'
|
Reference in New Issue
Block a user