mirror of
				https://github.com/amiaopensource/ffmprovisr.git
				synced 2025-10-26 14:41:58 +01:00 
			
		
		
		
	Compare commits
	
		
			295 Commits
		
	
	
		
			v2018-01-2
			...
			v2023-11-2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 8ea516d0a0 | ||
|  | afe768d1df | ||
|  | f16406504d | ||
|  | 7629b26417 | ||
|  | f3d98bc712 | ||
|  | 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 | ||
|  | 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 | ||
|  | b2d5fcadf3 | ||
|  | 05395f4670 | ||
|  | 078d20824c | ||
|  | 44c8661e96 | ||
|  | 13bc9bef10 | ||
|  | 585e0e1f18 | ||
|  | 1ef6c3305b | ||
|  | 9c4da4102a | ||
|  | c47a7a534f | ||
|  | 4d8fdc9f4e | ||
|  | ae590706b0 | ||
|  | e84f0a9fb6 | ||
|  | e2850d38c0 | ||
|  | 8927478efb | ||
|  | 3c815b1f3b | ||
|  | 58aa0549ff | ||
|  | 4a83b45e7e | ||
|  | f6b44c56ce | ||
|  | 8149aa163c | ||
|  | 94f935198f | ||
|  | c04c9ff12f | 
							
								
								
									
										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.3.0, available at | ||||
| [http://contributor-covenant.org/version/1/3/0/][version] | ||||
| version 2.0, available at | ||||
| https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. | ||||
|  | ||||
| [homepage]: http://contributor-covenant.org | ||||
| [version]: http://contributor-covenant.org/version/1/3/0/ | ||||
| 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. | ||||
|   | ||||
							
								
								
									
										25
									
								
								css/css.css
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								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; | ||||
| @@ -84,13 +85,10 @@ a:visited { | ||||
| } | ||||
|  | ||||
| .license img { | ||||
|   max-width: 10em; | ||||
|   max-width: 6em; | ||||
|   display: inline; | ||||
| } | ||||
|  | ||||
| h1, h2, h3, h4, h5, h6 { | ||||
|   font-family: 'Montserrat', sans-serif; | ||||
| } | ||||
|  | ||||
| h1 { | ||||
|   letter-spacing: 0.1em; | ||||
| @@ -107,13 +105,12 @@ h2 { | ||||
|   margin: 6px 0px 12px 0px; | ||||
| } | ||||
|  | ||||
| h3 { | ||||
| h3, h5 { | ||||
|   font-size: 1.5em; | ||||
| } | ||||
|  | ||||
| .intro-lead { | ||||
|   font-family: 'Montserrat', sans-serif; | ||||
|   font-size: 1em; | ||||
| h4 { | ||||
|   font-size: 1.2em; | ||||
| } | ||||
|  | ||||
| code { | ||||
| @@ -161,7 +158,6 @@ img { | ||||
| } | ||||
|  | ||||
| div { | ||||
|   font-family: 'Merriweather', serif; | ||||
|   color: white; | ||||
| } | ||||
|  | ||||
| @@ -173,7 +169,6 @@ div { | ||||
|   color: white; | ||||
|   background-color: #383838; | ||||
|   padding: 14px; | ||||
|   font-family: "Montserrat"; | ||||
|   letter-spacing: 0.05em; | ||||
|   border: 1px solid black; | ||||
|   cursor: pointer; | ||||
| @@ -250,17 +245,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; | ||||
|   | ||||
							
								
								
									
										
											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 | 
							
								
								
									
										1713
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										1713
									
								
								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; | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
|  | ||||
| }); | ||||
|   | ||||
							
								
								
									
										117
									
								
								readme.md
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								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. | ||||
|  | ||||
| @@ -12,29 +24,65 @@ 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? | ||||
|  | ||||
| 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. | ||||
|  | ||||
| @@ -44,52 +92,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 +171,20 @@ All Contributors: 22 | ||||
|  | ||||
| ## 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> | ||||
|   | ||||
							
								
								
									
										203
									
								
								recipes.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								recipes.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | ||||
| # 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 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 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 | ||||
| # Deinterlace video fields to frames | ||||
| ffmpeg -i input_file -c:v libx264 -vf "idet,bwdif,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 | ||||
| @@ -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}" | ||||
|   | ||||
| @@ -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}" | ||||
|   | ||||
| @@ -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
									
								
								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