Compare commits
	
		
			593 Commits
		
	
	
		
			v2017-02-2
			...
			v2025-04-1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b8eeeb88b8 | ||
|  | bb4cc16b8e | ||
|  | 4c8f63b05f | ||
|  | f57e2d443a | ||
|  | fc2cd7f23e | ||
|  | e46bdc189a | ||
|  | 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 | ||
|  | 64787edd4e | ||
|  | f995e8b483 | ||
|  | dea85d1e47 | ||
|  | e9fd3fd002 | ||
|  | debc510205 | ||
|  | 32260c405f | ||
|  | d142564f36 | ||
|  | d41674a267 | ||
|  | 99450e61de | ||
|  | 1fec9b21c8 | ||
|  | 42189e5b94 | ||
|  | 929f92a52a | ||
|  | 02e2f11718 | ||
|  | 10636e24e2 | ||
|  | 61b890d31c | ||
|  | 85a79d2eb5 | ||
|  | b5ec56174a | ||
|  | f0e0cf8ed3 | ||
|  | 5c1c336d77 | ||
|  | d71793583e | ||
|  | 6705bdf41d | ||
|  | 25e779a59f | ||
|  | ba0852a957 | ||
|  | 88024c040f | ||
|  | 3d9b9edf1c | ||
|  | c0326ad7d9 | ||
|  | 0cb6827b39 | ||
|  | 0d68614c04 | ||
|  | 1e86b70ba4 | ||
|  | ced142a215 | ||
|  | bf301daa71 | ||
|  | 278ac2baae | ||
|  | 10b8e4c941 | ||
|  | 1d1b3e4eac | ||
|  | 5a3e437d76 | ||
|  | 75a7aa1299 | ||
|  | cf13529485 | ||
|  | 7c03ae2f80 | ||
|  | affae48547 | ||
|  | 11ab1ae731 | ||
|  | 6b324152ac | ||
|  | edaa0a3443 | ||
|  | 133f81db8e | ||
|  | 634f72213b | ||
|  | 94049d2338 | ||
|  | 46356c3b98 | ||
|  | 53d3cf8a74 | ||
|  | 46ffb01181 | ||
|  | fe937d7e4a | ||
|  | 2cc48104b1 | ||
|  | 7e7942149e | ||
|  | 35a217c20b | ||
|  | ac0697f1c4 | ||
|  | 44ee05bcaf | ||
|  | 2e3c0b861b | ||
|  | f34858d644 | ||
|  | c18a193973 | ||
|  | 8cce1275a8 | ||
|  | fa08a2dbe8 | ||
|  | 09e637e6c4 | ||
|  | 5cb449afcc | ||
|  | b0f2b62767 | ||
|  | 48a51a6f6a | ||
|  | c552ffe699 | ||
|  | f4850a6010 | ||
|  | 0bddb123e1 | ||
|  | 66139ce781 | ||
|  | 921b75bb2e | ||
|  | 1e705b4914 | ||
|  | cf8756ced7 | ||
|  | c6a579a0bf | ||
|  | 494993d4c2 | ||
|  | a472a09597 | ||
|  | 05460bde51 | ||
|  | 0c32e03f3a | ||
|  | 1ac02df52a | ||
|  | 24b8c5ac35 | ||
|  | 9fceb27952 | ||
|  | 1e9629051f | ||
|  | b5e95143ca | ||
|  | 0a2e1ca63a | ||
|  | 21a019612c | ||
|  | 80ba7cfaa6 | ||
|  | 132a00f9e7 | ||
|  | d73ae6a382 | ||
|  | f427a05c89 | ||
|  | 3555a692dc | ||
|  | 11bf8d4de2 | ||
|  | 4ccf83b953 | ||
|  | f6be6aa37e | ||
|  | 04432d0323 | ||
|  | ea323d4b01 | ||
|  | 082f9a1175 | ||
|  | 04776428c8 | ||
|  | b1f7f5cad4 | ||
|  | 6d41096dd5 | ||
|  | 77c31a7c5c | ||
|  | 0c9086d70d | ||
|  | 2b6dfac5b0 | ||
|  | ba21f8b88d | ||
|  | b483acdb6d | ||
|  | d91fb336b9 | ||
|  | 97f62ae600 | ||
|  | 98d2459b79 | ||
|  | 719e3a73f5 | ||
|  | 439f1933da | ||
|  | 0f52cde91a | ||
|  | 8a14c6e5fb | ||
|  | 8c04a58949 | ||
|  | 6e93313528 | ||
|  | b7bc7218b8 | ||
|  | 7ec21fb6d2 | ||
|  | 1e2b2dd18f | ||
|  | 9d4e18e6ef | ||
|  | 61681c8dd3 | ||
|  | 71e68b5e2e | ||
|  | 872eec2aa7 | ||
|  | 863f70054d | ||
|  | 16c8d68e39 | ||
|  | 08593bb221 | ||
|  | 516a78d397 | ||
|  | 89ea7a28bd | ||
|  | 763e9c594f | ||
|  | fd7528a6bd | ||
|  | efd9e55b66 | ||
|  | da94557324 | ||
|  | f5887473f3 | ||
|  | 17ea63f7b9 | ||
|  | d7db07bcab | ||
|  | e92a1cf713 | ||
|  | 96903f018c | ||
|  | fcc95ce518 | ||
|  | 8c349b8282 | ||
|  | 93627e0da2 | ||
|  | 593bb63e23 | ||
|  | 3a58b6ae82 | ||
|  | 11848054a3 | ||
|  | c0e9a05e1d | ||
|  | 7cbdd6a074 | ||
|  | fa1cda441e | ||
|  | 7d07c3818a | ||
|  | 3374812782 | ||
|  | 9c871d760a | ||
|  | 22fa09470b | ||
|  | 9bae51d6a4 | ||
|  | b598ed1040 | ||
|  | 23148d4721 | ||
|  | df422912d6 | ||
|  | e5f6f5cf2d | ||
|  | 96c382943b | ||
|  | ef6e5d07dc | ||
|  | bf260c2ee2 | ||
|  | 7f1a765dd8 | ||
|  | 6c85518288 | ||
|  | 63abcd36d0 | ||
|  | 905b75547b | ||
|  | 7aa124c3d1 | ||
|  | 50185eb04e | ||
|  | 975766188f | ||
|  | fd1d596f50 | ||
|  | 18a80c10f1 | ||
|  | c6f7593d65 | ||
|  | e6962b3ca4 | ||
|  | 0ba25be082 | ||
|  | e4611d8b6b | ||
|  | d609a9b943 | ||
|  | d132e86f1d | ||
|  | e1e1060904 | ||
|  | 8b5fa8aa6a | ||
|  | 7bd05a8163 | ||
|  | 126fb1d284 | ||
|  | 9799316c19 | ||
|  | 6e4ed74841 | ||
|  | 0a6204264c | ||
|  | c835746c24 | ||
|  | 86e53b92c8 | ||
|  | 41423e0917 | ||
|  | 9a0875b692 | ||
|  | 0473e85448 | ||
|  | b57349a3ec | ||
|  | 9f3b56305c | ||
|  | 5593b86ab7 | ||
|  | 3544828fb1 | ||
|  | c8691285cc | ||
|  | e4a660967b | ||
|  | 86138a55e1 | ||
|  | 4c14af3209 | ||
|  | 8d18077af5 | ||
|  | 8871868eda | ||
|  | e1fb86ec94 | ||
|  | 7fe503d324 | ||
|  | 513631c80b | ||
|  | 22ff2368ad | ||
|  | c81827d98f | ||
|  | 19d249a09b | ||
|  | 04abe26b53 | ||
|  | ab3a8b25cf | ||
|  | 40e8f8c73c | ||
|  | 129540fbfc | ||
|  | 8578f01e1c | ||
|  | 0158a85a4b | ||
|  | cc724200d1 | ||
|  | 0c03f57df6 | ||
|  | 659e920e0b | ||
|  | 2037ec922f | ||
|  | c745152f8e | ||
|  | e12bbb0c6d | ||
|  | 2c0e555dc1 | ||
|  | ed81a16458 | ||
|  | 172657b1bb | ||
|  | 7af1a3de2c | ||
|  | 3f76abc053 | ||
|  | e3d11b3e7c | ||
|  | dbe9e1a049 | ||
|  | 0fe609a683 | ||
|  | 704a87f22c | ||
|  | b1a5f14e8c | ||
|  | 55b34452f7 | ||
|  | 18e2c17ab4 | ||
|  | e4309d6664 | ||
|  | 750810d392 | ||
|  | b2a04d138f | ||
|  | b53f6c9984 | ||
|  | 64a362314c | ||
|  | 2a71179776 | ||
|  | 77e346c067 | ||
|  | b995fb05c5 | ||
|  | d30741e378 | ||
|  | e3b01e2aa8 | ||
|  | 750a763157 | ||
|  | 0a6e5a4a7a | ||
|  | 54a8ab6057 | ||
|  | e762c7dc42 | ||
|  | cb7f001444 | ||
|  | 89039f55b3 | ||
|  | 59e6c6d879 | ||
|  | 195bc5446e | ||
|  | a1cc5a4428 | ||
|  | 58663a869f | ||
|  | 05d16367f0 | ||
|  | 9477bcfe0a | ||
|  | ad439d3b78 | ||
|  | 736b01e426 | ||
|  | 57166fe61d | ||
|  | ec26d2038a | ||
|  | 321d998b5a | ||
|  | 009670eed1 | ||
|  | d3a941a725 | ||
|  | d334d7b4de | ||
|  | d08cf349f6 | ||
|  | b5b06021b0 | ||
|  | e0ceeb0d73 | ||
|  | dc47dbc618 | ||
|  | 28ae979652 | ||
|  | 0e2a2c2bfe | ||
|  | 388b107a3f | ||
|  | 117ebf506d | ||
|  | 9356f9af93 | ||
|  | 4d2d5c7c81 | ||
|  | db202300e4 | ||
|  | bf55928a63 | ||
|  | 6cea5862d6 | ||
|  | dca518a9b6 | ||
|  | 45828357c9 | ||
|  | 10765da46a | ||
|  | ab2e6fb789 | ||
|  | e3e48ded1a | ||
|  | 9d58f313d4 | ||
|  | 1371b380c9 | ||
|  | dcb74e8da6 | ||
|  | bd0ac73d78 | ||
|  | 7e7da29093 | ||
|  | 47acc400ce | ||
|  | c117e18c0c | ||
|  | 0921bd68d5 | ||
|  | d0e13f3eb6 | ||
|  | 82a1cfeb8b | ||
|  | 472fcfe833 | ||
|  | 0907590913 | ||
|  | 0ed5cfff65 | ||
|  | e3deb3af4e | ||
|  | 5869850d4b | ||
|  | a5a49e1f28 | ||
|  | cdd65fd765 | ||
|  | c85d6c5874 | ||
|  | 63879e0e51 | ||
|  | d02633b612 | ||
|  | 0d92454148 | ||
|  | 8ebf23f172 | ||
|  | 43f228c930 | ||
|  | 22958ed956 | ||
|  | 16a4d3241e | 
							
								
								
									
										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. | ||||
|   | ||||
							
								
								
									
										7
									
								
								css/bootstrap.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										250
									
								
								css/css.css
									
									
									
									
									
								
							
							
						
						| @@ -1,84 +1,229 @@ | ||||
| h1,h2,h3,h4,h5,h6 { | ||||
|   font-family: 'Montserrat', sans-serif; | ||||
| html, body { | ||||
|   line-height: 1.5; | ||||
|   font-size: 18px; | ||||
|   font-family: sans-serif; | ||||
|   color: #888888; | ||||
|   background-color: #060606; | ||||
|   margin: 0; | ||||
|   word-break: break-word; | ||||
| } | ||||
|  | ||||
| .grid { | ||||
|   display: grid; | ||||
|   align-content: center; | ||||
|   grid-template-areas: | ||||
|    "header" | ||||
|    "sidebar" | ||||
|    "content" | ||||
|    "footer"; | ||||
| } | ||||
|  | ||||
| .header { | ||||
|   grid-area: header; | ||||
|   text-align: center; | ||||
| } | ||||
|  | ||||
| .content { | ||||
|   grid-area: content; | ||||
| } | ||||
|  | ||||
| .sidebar { | ||||
|   grid-area: sidebar; | ||||
| } | ||||
|  | ||||
| .footer { | ||||
|   grid-area: footer; | ||||
|   text-align: center; | ||||
| } | ||||
|  | ||||
| @media only screen and (max-width: 999px) { | ||||
|   .grid { | ||||
|     grid-template-columns: 1fr; | ||||
|     grid-template-areas: | ||||
|     "header" | ||||
|     "sidebar" | ||||
|     "content" | ||||
|     "footer"; | ||||
|   } | ||||
|   code { | ||||
|     word-break: break-all; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @media only screen and (min-width: 1000px) { | ||||
|   .grid { | ||||
|     grid-gap: 1rem; | ||||
|     grid-template-columns: 25% auto; | ||||
|     grid-template-areas: | ||||
|     "header  header" | ||||
|     "sidebar content" | ||||
|     "footer  footer"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @media only screen and (min-width: 1500px) { | ||||
|   .grid { | ||||
|     max-width: 70%; | ||||
|     margin: 0 auto; | ||||
|     grid-template-areas: | ||||
|     "header  header" | ||||
|     "sidebar content" | ||||
|     "footer  footer"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| a { | ||||
|   color: #91cf91; | ||||
| } | ||||
|  | ||||
| a:hover { | ||||
|   color: #5cb85c; | ||||
| } | ||||
|  | ||||
| a:visited { | ||||
|   color: #449d44; | ||||
| } | ||||
|  | ||||
| .license img { | ||||
|   max-width: 6em; | ||||
|   display: inline; | ||||
| } | ||||
|  | ||||
|  | ||||
| h1 { | ||||
|   letter-spacing: 0.1em; | ||||
|   font-size: 7vw; | ||||
| } | ||||
|  | ||||
| h2 { | ||||
|   font-size: 1.5em; | ||||
|   margin: 5px 8px 8px 8px; | ||||
| } | ||||
|  | ||||
| .heading { | ||||
|   font-size: 2em; | ||||
|   margin: 6px 0px 12px 0px; | ||||
| } | ||||
|  | ||||
| h3, h5 { | ||||
|   font-size: 1.5em; | ||||
| } | ||||
|  | ||||
| h4 { | ||||
|   font-size: 1.2em; | ||||
| } | ||||
|  | ||||
| code { | ||||
|   word-break: break-all; | ||||
|   padding: 2px 4px; | ||||
|   color: #c7254e; | ||||
|   background-color: #f9f2f4; | ||||
|   border-radius: 4px; | ||||
|   word-wrap: break-word; | ||||
|   max-width: 800px; | ||||
|   white-space: normal; | ||||
|   display: inline-block; | ||||
| } | ||||
|  | ||||
| dd { | ||||
|   padding-left:24px; | ||||
|   padding-left: 24px; | ||||
| } | ||||
|  | ||||
| dt { | ||||
|   font-family: Menlo,Monaco,Consolas,"Courier New",monospace; | ||||
|   font-family: Menlo, Monaco, Consolas, "Courier New", monospace; | ||||
|   word-break: break-all; | ||||
|   word-wrap: break-word; | ||||
|   white-space: normal; | ||||
|   display: inline-block; | ||||
| } | ||||
|  | ||||
| img { | ||||
|   display: block; | ||||
|   margin-left: auto; | ||||
|   margin-right: auto; | ||||
|   width: 100%; | ||||
| } | ||||
|  | ||||
| .sample-image { | ||||
|   margin: 0 auto; | ||||
|   margin-bottom: 18px; | ||||
|   max-width: 500px; | ||||
|   text-align: center; | ||||
| } | ||||
|  | ||||
| h1 { | ||||
|   letter-spacing:8px; | ||||
|   font-size:86px; | ||||
|   line-height:120px; | ||||
| .sample-image-small { | ||||
|   margin: 0 auto; | ||||
|   margin-bottom: 18px; | ||||
|   max-width: 250px; | ||||
|   text-align: center; | ||||
| } | ||||
|  | ||||
| div { | ||||
|   font-family: 'Merriweather', serif; | ||||
|   color: white; | ||||
| } | ||||
|  | ||||
| .btn { | ||||
|   margin: 8px; | ||||
| .sidebar a { | ||||
|   text-decoration: none; | ||||
| } | ||||
|  | ||||
| .btn { | ||||
|   display: inline-block; | ||||
|   vertical-align: middle; | ||||
|   -webkit-transform: translateZ(0); | ||||
|   transform: translateZ(0); | ||||
|   box-shadow: 0 0 1px rgba(0, 0, 0, 0); | ||||
|   -webkit-backface-visibility: hidden; | ||||
|   backface-visibility: hidden; | ||||
|   -moz-osx-font-smoothing: grayscale; | ||||
| .recipe, .contents-list { | ||||
|   color: white; | ||||
|   background-color: #383838; | ||||
|   padding: 14px; | ||||
|   letter-spacing: 0.05em; | ||||
|   border: 1px solid black; | ||||
|   cursor: pointer; | ||||
|   position: relative; | ||||
|   padding-left: 2.5em; | ||||
|   -webkit-transition-duration: 0.3s; | ||||
|   transition-duration: 0.3s; | ||||
|   padding-left: 2.8em; | ||||
|   transition: all .5s ease-out; | ||||
| } | ||||
| .btn:before { | ||||
|  | ||||
| .contents-list { | ||||
|   font-size: 0.9em; | ||||
| } | ||||
|  | ||||
| nav .heading { | ||||
|   word-break: normal; | ||||
| } | ||||
|  | ||||
| .recipe { | ||||
|   display: block; | ||||
|   width: 90%; | ||||
| } | ||||
|  | ||||
| .recipe:hover, .contents-list:hover { | ||||
|   background-color: #449d44; | ||||
| } | ||||
|  | ||||
| .recipe:before { | ||||
|   content: "💫"; | ||||
| } | ||||
|  | ||||
| .contents-list:before { | ||||
|   content: "📼"; | ||||
| } | ||||
|  | ||||
| .recipe:before, .contents-list:before { | ||||
|   position: absolute; | ||||
|   left: 1em; | ||||
|   padding: 0 1px; | ||||
|   -webkit-transform: translateZ(0); | ||||
|   transform: translateZ(0); | ||||
|   -webkit-transition-duration: 0.3s; | ||||
|   transition-duration: 0.3s; | ||||
|   -webkit-transition-property: transform; | ||||
|   transition-property: transform; | ||||
|   -webkit-transition-timing-function: ease-out; | ||||
|   transition-timing-function: ease-out; | ||||
|   padding-right: 1em; | ||||
| } | ||||
| .btn:hover:before, .btn:focus:before, .btn:active:before { | ||||
|   -webkit-transform: scale(1.3) translateZ(0); | ||||
|   transform: scale(1.3) translateZ(0); | ||||
|  | ||||
| .recipe:hover:before, .recipe:focus:before, .recipe:active:before { | ||||
|   transform: scale(1.5) translateX(0.1em); | ||||
|   transition: 0.5s; | ||||
| } | ||||
|  | ||||
| .contents-list:hover:before, .contents-list:focus:before, .contents-list:active:before { | ||||
|   transform: scale(1.8) translateX(0.3em); | ||||
|   transition: 0.5s; | ||||
| } | ||||
|  | ||||
| .codeblock { | ||||
|   font-family: monospace | ||||
|   padding: 2px 4px; | ||||
|   font-size: 90%; | ||||
|   color: #c7254e; | ||||
|   background-color: #f9f2f4; | ||||
|   border-radius: 4px | ||||
|   border-radius: 4px; | ||||
| } | ||||
|  | ||||
| .beware { | ||||
| @@ -88,3 +233,30 @@ div { | ||||
| .footnote { | ||||
|   font-size: 90%; | ||||
| } | ||||
|  | ||||
| .well { | ||||
|   padding: 1em; | ||||
|   margin-bottom: 0.5em; | ||||
|   background-color: #151515; | ||||
|   border: 1px solid #030303; | ||||
|   border-radius: 8px; | ||||
|   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); | ||||
| } | ||||
|  | ||||
| .hiding { | ||||
|   opacity: 0; | ||||
|   height: 0; | ||||
|   overflow: hidden; | ||||
| } | ||||
|  | ||||
| input { | ||||
|   position: absolute; | ||||
|   left: -999em; | ||||
| } | ||||
|  | ||||
| input[type=checkbox]:checked + div { | ||||
|   opacity: 1; | ||||
|   height: auto; | ||||
|   overflow: hidden; | ||||
|   transition: opacity .5s linear, height .5s linear; | ||||
| } | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								img/16_32_abitscope.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 450 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/brng.gif
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 7.6 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/cc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/crop_example_aftercrop1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 245 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/crop_example_aftercrop2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 167 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/crop_example_aftercrop3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 146 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/crop_example_orig.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 436 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/deinterlaced_video_frames.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 741 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/eia608_captions.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.1 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/interlaced_video_fields.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 422 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/ivtc_originalvideo.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/ivtc_result.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/life.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 574 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/outside_broadcast_range.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.9 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/vhs.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										4535
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										6
									
								
								js/bootstrap.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										4
									
								
								js/jquery.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										114
									
								
								js/js.js
									
									
									
									
									
								
							
							
						
						| @@ -1,28 +1,96 @@ | ||||
| $(document).ready(function() { | ||||
| function scrollTo(element, to, duration) { | ||||
|   var start = element.scrollTop, | ||||
|       change = to - start, | ||||
|       currentTime = 0, | ||||
|       increment = 20; | ||||
|  | ||||
|   $(function () { | ||||
|     $('[data-toggle="tooltip"]').tooltip() | ||||
|   }); | ||||
|  | ||||
|   // open modal window if a hash is found in URL | ||||
|   if(window.location.hash) { | ||||
|     $(window.location.hash).modal('show'); | ||||
|     // add direct link to modal window | ||||
|     $(".link").empty(); | ||||
|     $(".link").append("<small>Link to this command: <a href="+window.location.href+">"+window.location.href+"</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 to URL when modal is opened | ||||
|   $('span[data-toggle="modal"]').on("click", function(){ | ||||
|     window.location.hash = $(this).attr("data-target"); | ||||
|     // add direct link to modal window | ||||
|     $(".link").empty(); | ||||
|     $(".link").append("<small>Link to this command: <a href="+window.location.href+">"+window.location.href+"</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; | ||||
| } | ||||
|  | ||||
|   // remove hash from URL when modal is closed | ||||
|   $(document).on('hide.bs.modal', function (e) { | ||||
|     history.pushState("", document.title, window.location.pathname); | ||||
|   }); | ||||
| 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; | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
|  | ||||
| }); | ||||
|   | ||||
							
								
								
									
										150
									
								
								readme.md
									
									
									
									
									
								
							
							
						
						| @@ -1,78 +1,192 @@ | ||||
| # [ffmprovisr](http://amiaopensource.github.io/ffmprovisr) | ||||
|  | ||||
| Repository of useful FFmpeg command lines for archivists! [AMIA hackday](http://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_%26_Digital_Library_Federation_Hack_Day_2015) edition. | ||||
| 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: 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. | ||||
| ### 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. | ||||
|  | ||||
| ## How do I see it? | ||||
|  | ||||
| Code stuff in the gh-pages branch (the default primary branch). Readme is right here. The site is live and lives on github pages. You can see it [here](http://amiaopensource.github.io/ffmprovisr), or you can download a [release](https://github.com/amiaopensource/ffmprovisr/releases) and use it locally. | ||||
| 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 two commands: | ||||
| ``` | ||||
| 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 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. | ||||
| You are welcome to edit the codebase yourself, or just supply the information and ask it to be added to the site. | ||||
|  | ||||
| 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 and someone can review and integrate your code. There is a commented-out sample available at the bottom of index.html that can be used to build your own block. | ||||
| ### Edit codebase | ||||
|  | ||||
| If you are having trouble with the 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. | ||||
| 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. | ||||
|  | ||||
| #### 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 | ||||
|  | ||||
| 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. | ||||
|  | ||||
| ## 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 />This <span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" rel="dct:type">work</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://amiaopensource.github.io/ffmprovisr/" property="cc:attributionName" rel="cc:attributionURL">ffmprovisr</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://github.com/amiaopensource/ffmprovisr" rel="dct:source">https://github.com/amiaopensource/ffmprovisr</a>. | ||||
|  | ||||
| ## Code of Conduct | ||||
|  | ||||
| You can read our contributor code of conduct [here](https://github.com/amiaopensource/ffmprovisr/blob/gh-pages/code_of_conduct.md). | ||||
|  | ||||
| ## Maintainers | ||||
|  | ||||
| [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:   | ||||
| 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   | ||||
| jamessam (Jim)   | ||||
| 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: 11   | ||||
| All Contributors: 18   | ||||
| GitHub Contributors: 20   | ||||
| All Contributors: 37   | ||||
| Last updated: 2019-12-11 | ||||
|  | ||||
| ## AVHack Team: | ||||
| ## AVHack Team | ||||
|  | ||||
| [Ashley Blewer](https://github.com/ablwr), Eddy Colloton, Rebecca Dillmeier, [Jonathan Farbowitz](https://github.com/jfarbowitz), Rebecca Fraimow, Samuel Gutterman, Kelly Haydon, [Reto Kromer](https://github.com/retokromer), Nicole Martin, [Katherine Frances Nagels](https://github.com/kfrn), [Kieran O'Leary](https://github.com/kieranjol), Catriona Schlosser, Ben Turkus | ||||
| [Association of Moving Image Archivists & Digital Library Federation Hack Day 2015](http://wiki.curatecamp.org/index.php/Association_of_Moving_Image_Archivists_%26_Digital_Library_Federation_Hack_Day_2015) | ||||
|  | ||||
| [Ashley Blewer](https://github.com/ablwr), [Eddy Colloton](https://github.com/eddycolloton), Rebecca Dillmeier, [Jonathan Farbowitz](https://github.com/jfarbowitz), [Rebecca Fraimow](https://github.com/rfraimow), Samuel Gutterman, [Kelly Haydon](https://github.com/kellyhaydon), [Reto Kromer](https://github.com/retokromer), Nicole Martin, [Katherine Frances Nagels](https://github.com/kfrn), [Kieran O'Leary](https://github.com/kieranjol), Catriona Schlosser, [Ben Turkus](https://github.com/bturkus) | ||||
|  | ||||
| ## 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> | ||||
| This <span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" rel="dct:type">work</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://amiaopensource.github.io/ffmprovisr/" property="cc:attributionName" rel="cc:attributionURL">ffmprovisr</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.<br> | ||||
| Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://github.com/amiaopensource/ffmprovisr" rel="dct:source">https://github.com/amiaopensource/ffmprovisr</a>. | ||||
|   | ||||
							
								
								
									
										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:a copy -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 | ||||
							
								
								
									
										48
									
								
								check_framemd5.sh → scripts/check_audio_framemd5.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						| @@ -1,19 +1,19 @@ | ||||
| #!/usr/bin/env bash | ||||
|   SCRIPT=$(basename "${0}") | ||||
|  VERSION='2016-12-31' | ||||
|   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 | ||||
| 
 | ||||
| _output_prompt(){ | ||||
|     cat <<EOF | ||||
| Usage: ${SCRIPT} [-h] | [ -i <av_file> -m <md5_file> ] | ||||
| Usage: ${SCRIPT} -i <av_file> -m <md5_file> | -h | ||||
| EOF | ||||
|     exit 1 | ||||
| } | ||||
| @@ -21,18 +21,16 @@ EOF | ||||
| _output_help(){ | ||||
|     cat <<EOF | ||||
| Syntax: | ||||
|   ${SCRIPT} | ||||
|     Prompts a short help message. | ||||
|   ${SCRIPT} -h | ||||
|     This help. | ||||
|   ${SCRIPT} -i <av_file> -m <md5_file> | ||||
|     Pass to the script the audio-visual file and the corresponding MD5 | ||||
|     file to check. | ||||
|   ${SCRIPT} -h | ||||
|     This help. | ||||
| Dependency: | ||||
|   ffmpeg | ||||
| About: | ||||
|   Version: ${VERSION} | ||||
|   Website: https://github.com/amiaopensource/ffmprovisr/blob/gh-pages/check_framemd5.sh | ||||
|   Website: https://github.com/amiaopensource/ffmprovisr/blob/gh-pages/scripts/check_audio_framemd5.sh | ||||
| EOF | ||||
|     exit 0 | ||||
| } | ||||
| @@ -40,11 +38,11 @@ EOF | ||||
| unset input_file | ||||
| unset input_hash | ||||
| 
 | ||||
| while getopts ":hi:m:" opt; do | ||||
| while getopts ":i:m:h" opt; do | ||||
|     case "${opt}" in | ||||
|         i) input_file=${OPTARG} ;; | ||||
|         m) input_hash=${OPTARG} ;; | ||||
|         h) _output_help ;; | ||||
|         i) input_file=$OPTARG ;; | ||||
|         m) input_hash=$OPTARG ;; | ||||
|         :) echo -e "${RED}Error: option -${OPTARG} requires an argument${NC}" ; _output_prompt ;; | ||||
|         *) echo -e "${RED}Error: bad option -${OPTARG}${NC}" ; _output_prompt ;; | ||||
|     esac | ||||
| @@ -54,21 +52,23 @@ done | ||||
| echo -e "${BLUE}Please wait...${NC}" | ||||
| unset md5_tmp | ||||
| if [[ $OSTYPE = "cygwin" ]]; then | ||||
|     md5_tmp=""${USERPROFILE}/$(basename ${input_hash}).tmp"" | ||||
|     md5_tmp="${USERPROFILE}/$(basename "${input_hash}").tmp" | ||||
| else | ||||
|     md5_tmp="${HOME}/$(basename ${input_hash}).tmp" | ||||
|     md5_tmp="${HOME}/$(basename "${input_hash}").tmp" | ||||
| fi | ||||
| $(ffmpeg -i ${input_file} -loglevel 0 -f framemd5 -an ${md5_tmp}) | ||||
| # Find audio frame size for hash calculation | ||||
| unset sample_rate | ||||
| sample_rate=$(grep -v '^#' "${input_hash}" | head -n 1 | tr -d ' ' | cut -d',' -f4) | ||||
| ffmpeg -i "${input_file}" -loglevel 0 -af "asetnsamples=n='$sample_rate'" -f framemd5 -vn "${md5_tmp}" | ||||
| [[ ! -f ${md5_tmp} ]] && { echo -e "${RED}Error: '${input_file}' is not a valid audio-visual file.${NC}" ; _output_prompt ; } | ||||
| unset old_file | ||||
| unset tmp_file | ||||
| old_file=$(grep -v '^#' ${input_hash}) | ||||
| tmp_file=$(grep -v '^#' ${md5_tmp}) | ||||
| 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}" | ||||
|     echo -e "${BLUE}'$(basename "${input_file}")' matches '$(basename "${input_hash}")'${NC}" | ||||
| else | ||||
|     echo -e "${RED}The following differences were detected between '$(basename ${input_file})' and '$(basename ${input_hash})':${NC}" | ||||
|     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}" | ||||
							
								
								
									
										71
									
								
								scripts/check_video_framemd5.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,71 @@ | ||||
| #!/usr/bin/env bash | ||||
|   SCRIPT=$(basename "${0}") | ||||
|  VERSION="2018-02-10" | ||||
|   AUTHOR="ffmprovisr" | ||||
|      RED="\033[1;31m" | ||||
|     BLUE="\033[1;34m" | ||||
|       NC="\033[0m" | ||||
|  | ||||
| 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 | ||||
|  | ||||
| _output_prompt(){ | ||||
|     cat <<EOF | ||||
| Usage: ${SCRIPT} -i <av_file> -m <md5_file> | -h | ||||
| EOF | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| _output_help(){ | ||||
|     cat <<EOF | ||||
| Syntax: | ||||
|   ${SCRIPT} -i <av_file> -m <md5_file> | ||||
|     Pass to the script the audio-visual file and the corresponding MD5 | ||||
|     file to check. | ||||
|   ${SCRIPT} -h | ||||
|     This help. | ||||
| Dependency: | ||||
|   ffmpeg | ||||
| About: | ||||
|   Version: ${VERSION} | ||||
|   Website: https://github.com/amiaopensource/ffmprovisr/blob/gh-pages/scripts/check_video_framemd5.sh | ||||
| EOF | ||||
|     exit 0 | ||||
| } | ||||
|  | ||||
| unset input_file | ||||
| unset input_hash | ||||
|  | ||||
| while getopts ":i:m:h" opt; do | ||||
|     case "${opt}" in | ||||
|         i) input_file=${OPTARG} ;; | ||||
|         m) input_hash=${OPTARG} ;; | ||||
|         h) _output_help ;; | ||||
|         :) echo -e "${RED}Error: option -${OPTARG} requires an argument${NC}" ; _output_prompt ;; | ||||
|         *) echo -e "${RED}Error: bad option -${OPTARG}${NC}" ; _output_prompt ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| [[ -z "${#}" || ! ${input_file} || ! ${input_hash} ]] && _output_prompt | ||||
| echo -e "${BLUE}Please wait...${NC}" | ||||
| unset md5_tmp | ||||
| if [[ "${OSTYPE}" = "cygwin" ]]; then | ||||
|     md5_tmp="${USERPROFILE}/$(basename "${input_hash}").tmp" | ||||
| else | ||||
|     md5_tmp="${HOME}/$(basename "${input_hash}").tmp" | ||||
| fi | ||||
| ffmpeg -i "${input_file}" -loglevel 0 -f framemd5 -an "${md5_tmp}" | ||||
| [[ ! -f "${md5_tmp}" ]] && { echo -e "${RED}Error: '${input_file}' is not a valid audio-visual file.${NC}" ; _output_prompt ; } | ||||
| unset old_file | ||||
| unset tmp_file | ||||
| 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}" | ||||
| else | ||||
|     echo -e "${RED}The following differences were detected between '$(basename "${input_file}")' and '$(basename "${input_hash}")':${NC}" | ||||
|     diff "${input_hash}" "${md5_tmp}" | ||||
| fi | ||||
| rm "${md5_tmp}" | ||||
							
								
								
									
										24
									
								
								scripts/ffmprovisr
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # This allows to open the online version of the ffmprovisr, when the computer is | ||||
| # connected to the Web, and the local version otherwise. | ||||
|  | ||||
| if [[ "$(uname -s)" = "Darwin" ]] ; then | ||||
|     if ping -c 1 amiaopensource.github.io >/dev/null 2>&1 ; then | ||||
|         ffmprovisr_path='https://amiaopensource.github.io/ffmprovisr/' | ||||
|     elif [[ -d /usr/local/Cellar/ffmprovisr ]] ; then | ||||
|         ffmprovisr_path=$(find /usr/local/Cellar/ffmprovisr -name 'index.html' | sort -M | tail -n1) | ||||
|     else | ||||
|         ffmprovisr_path=$(find /opt/homebrew/Cellar/ffmprovisr -name 'index.html' | sort -M | tail -n1) | ||||
|     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/' | ||||
|     else | ||||
|         ffmprovisr_path=$(find ~/.linuxbrew/Cellar/ffmprovisr -iname 'index.html' | sort -M | tail -n1) | ||||
|     fi | ||||
|     xdg-open "${ffmprovisr_path}" | ||||
| else | ||||
|     echo "Please locate the 'ffmprovisr' folder, and open the 'index.html' file in a browser." | ||||
| fi | ||||
							
								
								
									
										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' | ||||