mirror of
https://github.com/amiaopensource/ffmprovisr.git
synced 2025-10-14 17:59:56 +02:00
Compare commits
122 Commits
v2019-08-0
...
v2023-08-0
Author | SHA1 | Date | |
---|---|---|---|
|
8290b25fe5 | ||
|
53334033d0 | ||
|
86a04859a2 | ||
|
dada53dff4 | ||
|
f100b46233 | ||
|
d1083e012c | ||
|
08a27055c3 | ||
|
63033942f1 | ||
|
aba38e0a08 | ||
|
393a8cc22f | ||
|
20cbf26144 | ||
|
e6552c5494 | ||
|
0d27ffa5d1 | ||
|
bf93a20da8 | ||
|
3c393a688e | ||
|
961f401c34 | ||
|
f3cc3b518f | ||
|
3555a9b61e | ||
|
9a36ef66ba | ||
|
e7d8dd58b9 | ||
|
a25c20a855 | ||
|
c0d3761ce5 | ||
|
869ffda8c4 | ||
|
789329b415 | ||
|
23e0097b54 | ||
|
ca86a0eca4 | ||
|
bc0edae268 | ||
|
87314cef76 | ||
|
77a7a2b3dc | ||
|
f0aab69f0f | ||
|
5c0b98bded | ||
|
2677cd74e7 | ||
|
46d65cf4d0 | ||
|
638bb951dd | ||
|
87581c717c | ||
|
ba49741c9f | ||
|
de49996097 | ||
|
708cd0eae3 | ||
|
e39d70ac2b | ||
|
7dd7f1c355 | ||
|
6f3e8eb0a4 | ||
|
885535c33b | ||
|
515c0c3ae2 | ||
|
528ba39135 | ||
|
d3971b7ec2 | ||
|
b04c0723b5 | ||
|
f2ab1827f7 | ||
|
9a1c1af578 | ||
|
8963b4af7e | ||
|
5f3fd5e464 | ||
|
2adc238e3e | ||
|
a35dcb2883 | ||
|
d9cceb5dbd | ||
|
904861ddd2 | ||
|
2ab4584bae | ||
|
8ddd07134f | ||
|
0294761f77 | ||
|
33582ee6ea | ||
|
77c7cc337a | ||
|
ee6136a020 | ||
|
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 |
3
.github/pull_request_template.md
vendored
Normal file
3
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
## Checklist
|
||||
|
||||
* [ ] I've referred to the [Guidelines for contributing](https://github.com/amiaopensource/ffmprovisr/blob/gh-pages/readme.md#guidelines-for-contributing)
|
@@ -1,50 +1,133 @@
|
||||
# Contributor Code of Conduct
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
As contributors and maintainers of this project, and in the interest of
|
||||
fostering an open and welcoming community, we pledge to respect all people who
|
||||
contribute through reporting issues, posting feature requests, updating
|
||||
documentation, submitting pull requests or patches, and other activities.
|
||||
## Our Pledge
|
||||
|
||||
We are committed to making participation in this project a harassment-free
|
||||
experience for everyone, regardless of level of experience, gender, gender
|
||||
identity and expression, sexual orientation, disability, personal appearance,
|
||||
body size, race, ethnicity, age, religion, or nationality.
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
* The use of sexualized language or imagery
|
||||
* Personal attacks
|
||||
* Trolling or insulting/derogatory comments
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing other's private information, such as physical or electronic
|
||||
addresses, without explicit permission
|
||||
* Other unethical or unprofessional conduct
|
||||
* Publishing others’ private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
## Enforcement Responsibilities
|
||||
|
||||
By adopting this Code of Conduct, project maintainers commit themselves to
|
||||
fairly and consistently applying these principles to every aspect of managing
|
||||
this project. Project maintainers who do not follow or enforce the Code of
|
||||
Conduct may be permanently removed from the project team.
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting a project maintainer. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. Maintainers are
|
||||
obligated to maintain confidentiality with regard to the reporter of an
|
||||
incident.
|
||||
reported to the community leaders responsible for enforcement, who are the
|
||||
ffmprovisr maintainers:
|
||||
* Ashley Blewer (ashley.blewer@gmail.com)
|
||||
* Katherine Frances Nagels (kfnagels@gmail.com)
|
||||
* Kieran O'Leary (kieran.o.leary@gmail.com)
|
||||
* Andrew Weaver (theandrewjw@gmail.com)
|
||||
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 1.4.1, available at
|
||||
[https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version]
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org/
|
||||
[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
Community Impact Guidelines were inspired by [Mozilla’s code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
|
@@ -85,7 +85,7 @@ a:visited {
|
||||
}
|
||||
|
||||
.license img {
|
||||
max-width: 10em;
|
||||
max-width: 6em;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ h2 {
|
||||
margin: 6px 0px 12px 0px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
h3, h5 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
@@ -113,10 +113,6 @@ h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.intro-lead {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
code {
|
||||
padding: 2px 4px;
|
||||
color: #c7254e;
|
||||
|
BIN
img/deinterlaced_video_frames.png
Normal file
BIN
img/deinterlaced_video_frames.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 741 KiB |
BIN
img/interlaced_video_fields.png
Normal file
BIN
img/interlaced_video_fields.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 422 KiB |
473
index.html
473
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
126
js/js.js
126
js/js.js
@@ -1,42 +1,96 @@
|
||||
$(document).ready(function() {
|
||||
function scrollTo(element, to, duration) {
|
||||
var start = element.scrollTop,
|
||||
change = to - start,
|
||||
currentTime = 0,
|
||||
increment = 20;
|
||||
|
||||
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);
|
||||
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)
|
||||
appendLink('#' + id)
|
||||
})
|
||||
|
||||
// open recipe when clicked
|
||||
$('a').on("click", function(){
|
||||
intralink = $(this).attr("href")
|
||||
if (intralink[0] == "#") {
|
||||
moveToRecipe(intralink)
|
||||
var animateScroll = function(){
|
||||
currentTime += increment;
|
||||
var val = Math.easeInOutQuad(currentTime, start, change, duration);
|
||||
element.scrollTop = val;
|
||||
if(currentTime < duration) {
|
||||
setTimeout(animateScroll, increment);
|
||||
}
|
||||
}
|
||||
animateScroll()
|
||||
}
|
||||
|
||||
//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 all windows if button is clicked
|
||||
$('#open-all').on("click", function(){
|
||||
$('input[type=checkbox]').each(function(){
|
||||
this.checked = !this.checked;
|
||||
|
||||
// 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;
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
|
75
readme.md
75
readme.md
@@ -2,9 +2,21 @@
|
||||
|
||||
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)
|
||||
* [Guidelines for contributing](#guidelines-for-contributing)
|
||||
* [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
|
||||
### Project Objective
|
||||
|
||||
To facilitate better understanding of FFmpeg through collaborative sharing of useful scripts and detailed flag-level description of how each script works, so archivists can copy-paste and produce their own scripts, but also understand how and why they work.
|
||||
|
||||
@@ -23,7 +35,7 @@ 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
|
||||
### 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:
|
||||
|
||||
@@ -47,15 +59,30 @@ The used [one-liner](scripts/get_recipe_list) is in the `scripts` folder.
|
||||
|
||||
You are welcome to edit the codebase yourself, or just supply the information and ask it to be added to the site.
|
||||
|
||||
#### Edit codebase
|
||||
### Edit codebase
|
||||
|
||||
To contribute to this project directly (and more quickly), clone this repository and create a new branch (`git checkout -b your-branch-name`) and add or modify a new block in `index.html`. Then [submit a pull request](https://github.com/amiaopensource/ffmprovisr/pulls) and the maintainers will review and integrate your code. There is a commented-out sample block available at the bottom of `index.html` that can be as a guideline for your command.
|
||||
To contribute to this project directly (and more quickly), clone this repository and create a new branch (`git checkout -b your-branch-name`) and add or modify a new block in `index.html`. Then [submit a pull request](https://github.com/amiaopensource/ffmprovisr/pulls) and the maintainers will review and integrate your code. There is a commented-out sample block available at the bottom of `index.html` that can be a guideline for your command.
|
||||
|
||||
#### Make a request
|
||||
#### Guidelines for contributing
|
||||
|
||||
* Recipes should ideally do just one thing or solve one problem, to keep things as user-friendly as possible and to avoid unintended side-effects
|
||||
* Explanations and examples for recipes should be as generic as possible, to allow users to alter the command for their own use-case.
|
||||
* This may involve the use of `VARIABLE_NAMES`
|
||||
* Example: [Fade video and audio streams](https://amiaopensource.github.io/ffmprovisr/#fade_streams)
|
||||
* Some recipes may benefit from including a GIF that shows the output
|
||||
* Example: [Plays a graphical output showing decibel levels of an input file](https://amiaopensource.github.io/ffmprovisr/#astats)
|
||||
* Some recipes require an explanatory section which may not fit gracefully into the recipe itself
|
||||
* Example: [Rewrap a file](https://amiaopensource.github.io/ffmprovisr/#basic-rewrap)
|
||||
* Recipes involving `-filter_complex` can be some of the most verbose and difficult to understand, so breaking these down as much as possible into their relevant sections is ideal
|
||||
* Example: [Generate two access MP3s from input](https://amiaopensource.github.io/ffmprovisr/#append_mp3)
|
||||
* Some recipes may refer to a specific standard or vocabulary, and it's useful to link to these so that the user can scale the recipe to their use case
|
||||
* Example: [Generate Broadcast WAV](https://amiaopensource.github.io/ffmprovisr/#bwf)
|
||||
|
||||
### Make a request
|
||||
|
||||
If you are having trouble with coding it yourself or with GitHub, feel free to [submit an issue](https://github.com/amiaopensource/ffmprovisr/issues) with the kind of command you would like to see added to the site.
|
||||
|
||||
#### General help
|
||||
### General help
|
||||
|
||||
If you want to help but don't have a new script to add, you can help us by testing out the scripts available, by refining or clarifying the documentation, or [creating an issue](https://github.com/amiaopensource/ffmprovisr/issues) for anything that sounds confusing and requires clarification.
|
||||
|
||||
@@ -70,33 +97,38 @@ You can read our contributor code of conduct [here](https://github.com/amiaopens
|
||||
## Contributors
|
||||
* Gathered using [octohatrack](https://github.com/LABHR/octohatrack)
|
||||
|
||||
*Code Contributors*:
|
||||
*Code Contributors*:
|
||||
ablwr (Ashley)
|
||||
alavigne12 (A. Lavigne)
|
||||
Anushka-codergirl (Anushka Raj)
|
||||
bastibeckr (Basti Becker)
|
||||
b00giehead (Joanna White)
|
||||
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)
|
||||
b00giehead (Joanna White)
|
||||
brainwane (Sumana Harihareswara)
|
||||
bturkus
|
||||
dericed (Dave Rice)
|
||||
digitensions (Joanna White)
|
||||
drodz11 (Dave Rodriguez)
|
||||
edsu (Ed Summers)
|
||||
EG-tech (Ethan Gates)
|
||||
@@ -111,7 +143,9 @@ 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)
|
||||
@@ -121,12 +155,13 @@ retokromer (Reto Kromer)
|
||||
rfraimow
|
||||
richardpl (Paul B Mahol)
|
||||
ross-spencer (Ross Spencer)
|
||||
taschenbach (Tommy Aschenbach)
|
||||
todrobbins (Tod Robbins)
|
||||
|
||||
Repo: amiaopensource/ffmprovisr
|
||||
Code Contributors: 17
|
||||
All Contributors: 32
|
||||
Last updated: 2019-02-11
|
||||
GitHub Contributors: 20
|
||||
All Contributors: 37
|
||||
Last updated: 2019-12-11
|
||||
|
||||
## AVHack Team
|
||||
|
||||
@@ -137,9 +172,19 @@ Last updated: 2019-02-11
|
||||
## Sister projects
|
||||
|
||||
[The Cable Bible](https://amiaopensource.github.io/cable-bible/): A Guide to Cables and Connectors Used for Audiovisual Tech
|
||||
[FFCommand_Engine](https://github.com/ColorlabMD/FFCommand_Engine): a tool for easier use of FFmpeg binaries
|
||||
[QEMU QED](https://eaasi.gitlab.io/program_docs/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>
|
||||
|
41
recipes.txt
41
recipes.txt
@@ -1,5 +1,7 @@
|
||||
# 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
|
||||
@@ -14,14 +16,18 @@ ffmpeg -i input_file -map 0 -dn -c:v ffv1 -level 3 -g 1 -slicecrc 1 -slices 16 -
|
||||
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 H.264 using the GPU
|
||||
ffmpeg -i input_file -c:v h264_nvenc -preset llhq -rc:v vbr_hq -cq:v 19 -b:v 8000k -maxrate:v 12000k -profile:v high -c:a copy output_file
|
||||
# Transcode to H.265 using the GPU
|
||||
ffmpeg -i input_file -c:v hevc_nvenc -preset llhq -rc:v vbr_hq -cq:v 19 -b:v 5000k -maxrate:v 8000k -profile:v main10 -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
|
||||
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 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
|
||||
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 rectangular -ar 44100 output_file.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
|
||||
@@ -36,6 +42,8 @@ ffmpeg -i input_file -c:v copy -aspect 4:3 output_file
|
||||
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
|
||||
@@ -104,7 +112,7 @@ ffmpeg -i input_file -ss 00:00:20 -vframes 1 thumb.png
|
||||
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
|
||||
# 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
|
||||
@@ -141,6 +149,8 @@ ffmpeg -i input_file -af "asetnsamples=n=48000" -f framemd5 -vn output_file
|
||||
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)
|
||||
@@ -155,7 +165,7 @@ ffmpeg -f lavfi -i smptebars=size=720x576:rate=25 -c:v prores -t 10 output_file
|
||||
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
|
||||
# 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
|
||||
@@ -175,7 +185,7 @@ ffmpeg -i input_one -i input_two -filter_complex signature=detectmode=full:nb_in
|
||||
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
|
||||
# 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
|
||||
@@ -189,22 +199,3 @@ ffmpeg -i input_file -filter:v drawbox=w=iw:h=7:y=ih-h:t=max output_file
|
||||
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
|
||||
|
@@ -4,17 +4,12 @@
|
||||
# connected to the Web, and the local version otherwise.
|
||||
|
||||
if [[ "$(uname -s)" = "Darwin" ]] ; then
|
||||
default_browser=$(plutil -convert json ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist -r -o - | grep https -b1 | tail -n1 | cut -d'"' -f4)
|
||||
if ping -c 1 amiaopensource.github.io >/dev/null 2>&1 ; then
|
||||
ffmprovisr_path='https://amiaopensource.github.io/ffmprovisr/'
|
||||
else
|
||||
ffmprovisr_path=$(find /usr/local/Cellar/ffmprovisr -iname 'index.html' | sort -M | tail -n1)
|
||||
fi
|
||||
if [[ -n "${default_browser}" ]] ; then
|
||||
open -b "${default_browser}" "${ffmprovisr_path}"
|
||||
else
|
||||
open "${ffmprovisr_path}"
|
||||
fi
|
||||
open "${ffmprovisr_path}"
|
||||
elif [[ "$(uname -s)" = "Linux" ]] ; then
|
||||
if ping -c 1 amiaopensource.github.io >/dev/null 2>&1 ; then
|
||||
ffmprovisr_path='https://amiaopensource.github.io/ffmprovisr/'
|
||||
|
@@ -1 +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'
|
||||
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