{"_id":"ffmpeg-stream","_rev":"16-20ea191aa65dd340f3ab4010433cb883","name":"ffmpeg-stream","dist-tags":{"latest":"1.0.1"},"versions":{"0.1.0":{"name":"ffmpeg-stream","version":"0.1.0","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.1.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"b489a72ff13bc90ce90039c8dee15493fef21187","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.1.0.tgz","integrity":"sha512-rlyNPgiAKfn8x9Eyo4FocdlMv2pTdEahtXdHz0xU32kiHwSRJtn1+zf3aGxN1Qsj3UqGkTkNn8ROEgjrmIK1jA==","signatures":[{"sig":"MEUCIQCWRJ+elM3+IZIAwZdsD/17IwRXVR9jJRLiLZ9KEFCwGQIgb4nDwtG+1jMkMdfND93k5BXGUbbcYC57D4yjnmmp4Jc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"_from":".","_shasum":"b489a72ff13bc90ce90039c8dee15493fef21187","gitHead":"50880979832c7f7f5234920b80970bb2744237e1","scripts":{"test":"mocha --compilers coffee:coffee-script/register"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"2.7.1","description":"Stream-based media transcoding","directories":{},"_nodeVersion":"0.10.36","dependencies":{"debug":"^2.2.0","sync-exec":"^0.5.0"},"devDependencies":{"chai":"^2.3.0","mocha":"~2.2.4","is-mime":"^0.2.0","coffee-script":"~1.9.2"}},"0.2.0":{"name":"ffmpeg-stream","version":"0.2.0","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.2.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"ab43460d7c08093830c3dc85b3bb3eb31cb87131","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.2.0.tgz","integrity":"sha512-R6hs85ABfGXEe4je8ZfBgM0APfDky6GDZN57CnKi6iWWtIdyorgmChM1SkJWgMRVGSr2jfoJ0PeNm6w86pkIqA==","signatures":[{"sig":"MEYCIQDfI2rfzXtLPa4LausCSAB3hbLxSRNAc+7dHj2I0nJ7sAIhAP0JNV/VyydiFxI7iYUdyGtoj6HuEf23C3e+EHSZKHN7","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"_from":".","scripts":{"test":"mocha --compilers coffee:coffee-script/register"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"1.3.6","description":"Stream-based media transcoding","directories":{},"dependencies":{"debug":"^2.2.0","sync-exec":"^0.5.0"},"devDependencies":{"chai":"^2.3.0","mocha":"~2.2.4","is-mime":"^0.2.0","coffee-script":"~1.9.2"}},"0.2.1":{"name":"ffmpeg-stream","version":"0.2.1","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.2.1","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"047f0f4307239f40c0327daf89ec1f594c49010d","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.2.1.tgz","integrity":"sha512-RRcE23HClgADVF1fnuVYLzCN8BsarIk5RCCkMRlGZGtzOCpk1QZM/ssX/lF1wv+sbaLPEdJ+5uu647MuHEXLsQ==","signatures":[{"sig":"MEUCIQCQeSFponUbgiHcGmtaqXEdycf2Ij8ZUvAOl1ayuy/QxQIgY1xmgPpcdVombbmpMxNJDTnET2rpYUkupL4esc76t9M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"_from":".","scripts":{"test":"mocha --compilers coffee:coffee-script/register"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"1.3.6","description":"Stream-based media transcoding","directories":{},"dependencies":{"debug":"^2.2.0","sync-exec":"^0.5.0"},"devDependencies":{"chai":"^2.3.0","mocha":"~2.2.4","is-mime":"^0.2.0","coffee-script":"~1.9.2"}},"0.3.0":{"name":"ffmpeg-stream","version":"0.3.0","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.3.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"89c11aa94d0b7268051a4309e957993da32b971e","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.3.0.tgz","integrity":"sha512-4fzJgA6cR1X4nf2ka0N4fc4ri8wTBR8G8fI740qawp4wqzGdVNJATFci+ZqQhDCLRFhUbHd15wQqdPABgQ/wHA==","signatures":[{"sig":"MEYCIQD4CYHcfrK+mgxTqDI7ploClQa8wQdrJkxKTb+eZ4hu9AIhAIH32oLIi+ritdsPe8hXZwWiKg8Zvm/oeB5gefnOonHY","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/index.js","_from":".","scripts":{"test":"gulp","prepublish":"gulp"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"1.3.6","description":"Stream-based media transcoding","directories":{},"dependencies":{"tmp":"0.0.26","debug":"^2.2.0","bluebird":"~2.9.34"},"devDependencies":{"chai":"^2.3.0","gulp":"~3.9.0","mkdirp":"~0.5.1","rimraf":"~2.4.2","is-mime":"^0.3.0","gulp-util":"~3.0.6","gulp-mocha":"~2.1.3","gulp-coffee":"~2.3.1","coffee-script":"~1.9.2","chai-as-promised":"~5.1.0"}},"0.4.0":{"name":"ffmpeg-stream","version":"0.4.0","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.4.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"2cfc744c09c623358fb53f542c4d18de7114dc65","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.4.0.tgz","integrity":"sha512-4La3pifVR0MVvKsqTj4WVGdEa1kSkMB4bcugaG+lQhiZlTx5ofF1VDF02CfczxbSk0hry124pjYteb1hsRWXGw==","signatures":[{"sig":"MEUCIQCOMN0scjygH9mc4Vy2EbUoH/uD7HVhZaOHytQSEUKg+gIgXYszMJj9K+cwiOSbfPolryVNbhXKoLVcQQZvNBUNPdM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/index.js","_from":".","_shasum":"2cfc744c09c623358fb53f542c4d18de7114dc65","gitHead":"bde89cfaed3a800d0a6a61f94538f1688ddf4956","scripts":{"test":"gulp","prepublish":"gulp"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"3.10.9","description":"Stream-based media transcoding","directories":{},"_nodeVersion":"7.2.0","dependencies":{"tmp":"0.0.26","debug":"^2.2.0","bluebird":"~2.9.34"},"devDependencies":{"chai":"^2.3.0","gulp":"~3.9.0","mkdirp":"~0.5.1","rimraf":"~2.4.2","is-mime":"^0.3.0","gulp-util":"~3.0.6","gulp-mocha":"~2.1.3","gulp-coffee":"~2.3.1","coffee-script":"~1.9.2","chai-as-promised":"~5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ffmpeg-stream-0.4.0.tgz_1480711930394_0.2697011318523437","host":"packages-18-east.internal.npmjs.com"}},"0.5.0":{"name":"ffmpeg-stream","version":"0.5.0","keywords":["ffmpeg","avconv","convert","transcode","media","audio","video","image","resize"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.5.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"f47863a842e4540696c17d3cb26bd07cade2f19c","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.5.0.tgz","integrity":"sha512-pqjh1z1DP6N0rZYFlMfy7XP6cEsenS1vVkGRJ1n+XyjJSxG1TRJlCWkRJtrDfH48LQjD9uXV3TRadfWkJP0osQ==","signatures":[{"sig":"MEUCIQCn33EF588OKC6CVwgwlh4Jr7ZI/VGlhHyHIOw4foCuuQIgd1TsG2ukHmy6W2E5ebSmjM85Ut4w8mHHCFt7rv4vlm4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/index.js","_from":".","_shasum":"f47863a842e4540696c17d3cb26bd07cade2f19c","gitHead":"f24561a1c12164485391733819723cb53254bb65","scripts":{"test":"gulp","prepublish":"gulp"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"repository":{"url":"git://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"3.10.9","description":"Stream-based media transcoding","directories":{},"_nodeVersion":"7.2.0","dependencies":{"tmp":"0.0.26","debug":"^2.2.0","bluebird":"~2.9.34"},"devDependencies":{"chai":"^2.3.0","gulp":"~3.9.0","mkdirp":"~0.5.1","rimraf":"~2.4.2","is-mime":"^0.3.0","gulp-util":"~3.0.6","gulp-mocha":"~2.1.3","gulp-coffee":"~2.3.1","coffee-script":"~1.9.2","chai-as-promised":"~5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ffmpeg-stream-0.5.0.tgz_1480712581037_0.18798308609984815","host":"packages-18-east.internal.npmjs.com"}},"0.6.0":{"name":"ffmpeg-stream","version":"0.6.0","keywords":["ffmpeg","convert","transcode","media","video"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.6.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream#readme","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"7225032f45f3564d205085c10963176d90024758","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.6.0.tgz","fileCount":5,"integrity":"sha512-SnfSkBftW8Zhk12BbA5IXrCFovH2seOs84eafGq7/lLol38KrDz6xbRVqc8hby81L9SdMOAB4JJEpd7S9k1pQg==","signatures":[{"sig":"MEUCIHFTa4myVBUpRASczObIoLQnQey8lYPozy36CnT/jpFRAiEApKNjqaTQi/ph4D9nFDIYDGzF1SUdEoPjGVFTMxd+//s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZxeUCRA9TVsSAnZWagAAK7gP/2oLhU9mgZcFub3kJsBU\nLAX2+6v7r/0YCfIJ478CynHjnZnVl3OFPUITg6FNIKrYqnqSlHeBDR9b4+fH\nE+Zd94H2iuMHXy5jsJFnKylSB+IPBzNFt/835yRghm7Dw8sz09KuG13Ta44h\nx22TyBczSh22AFaVdd2wdGtA2RLP5I73DraCpSWWDdb7uK/d2/bVy3+bIYrc\nVQEe7vley9wcKw0xx4ywF1Oi8sDCkehMvNk5leMKkFTi2bCoyTLHizar9CQk\ndSTyx8dfStm6T4/Qs8QaSNgvVzPnnaG2gu4VA4oDfR+BDLSTaIAf2htF6cWm\nzshxqrZCl+JDql7CUjlIp+np4vBno27p5umWVbDGHLbdu1XNEu3ezxeNmm0O\n+Vpyr5zNomRk3X1fgCttZPzyQmHa1Qwp4w/NpJSsQGSjER12NZLEPAYyD6V9\nw0tbjOXf5acvreWvjpBk8RD+3r2rar9u0CSkD01YJ5vn4R45N/qKjhqwM2dD\nIRhYtYnG/5vkxyydo2GuRheEtf3bjhmnyvT4ow6bbpInsfYK9rT3Rt4qvpbi\nTlWX+HXRgk1Es58q4yRYZ7LA8joCSnBSXtYnRxGMeOnx/Cts1FsVqbIiTNi1\nOFmSfLAjEnYsHF1G3L3o7Cs6rpJjPeFDrlE7ItFUPWK0ba6A9sIvgRRiNr2k\n4QN4\r\n=J7Ai\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest"},"main":"lib","husky":{"hooks":{"pre-commit":"lint-staged"}},"gitHead":"90f31c8095a3ba2d234fbf392ebc3c946c17f8b8","scripts":{"test":"run-s test:*","prepare":"tsc","test:tsc":"tsc --noEmit","test:jest":"jest --coverage","test:eslint":"eslint --ext js,ts .","test:prettier":"prettier --check \"**/*.{js,ts,json}\""},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"prettier":{"semi":false,"trailingComma":"all"},"repository":{"url":"git+https://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"6.9.0","description":"Node bindings to ffmpeg command, exposing stream based API","directories":{},"lint-staged":{"*.{js,ts}":["eslint --fix","git add"],"*.{js,ts,json}":["prettier --write","git add"]},"_nodeVersion":"10.16.0","dependencies":{"debug":"^4.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^24.9.0","husky":"^3.0.4","eslint":"^6.2.2","mkdirp":"~0.5.1","rimraf":"^3.0.0","is-mime":"^0.3.0","ts-jest":"^24.0.2","prettier":"^1.18.2","typescript":"^3.5.3","@types/jest":"^24.0.18","@types/node":"^12.7.2","lint-staged":"^9.2.5","npm-run-all":"^4.1.5","@types/debug":"^4.1.5","@types/mkdirp":"^0.5.2","@types/rimraf":"^2.0.2","eslint-config-prettier":"^6.1.0","@typescript-eslint/parser":"^2.0.0","@typescript-eslint/eslint-plugin":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ffmpeg-stream_0.6.0_1567037332026_0.6314837031479372","host":"s3://npm-registry-packages"}},"0.7.0":{"name":"ffmpeg-stream","version":"0.7.0","keywords":["ffmpeg","convert","transcode","media","video"],"author":{"name":"phaux","email":"phaux4@gmail.com"},"license":"MIT","_id":"ffmpeg-stream@0.7.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream#readme","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"bd945bdb2cf4e7966f67e97d06a580442cec3dcf","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-0.7.0.tgz","fileCount":5,"integrity":"sha512-Cz6EDH1LGBMZAb2ae03hvyMkrhZr7LdQ5fj/YUnaj00pxs5BDVZAF2AsYrthO8RrJ8ybwNTlAmvyztAOuuQg3g==","signatures":[{"sig":"MEUCIQDbRukagelg8ZgQMMsgQSWlZv/4X71Ii2psIOsM0o7U8wIgNpP9MZfU0du4KOlaTXMt0JB/m5ijR1aO5vvWTqnkpLA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":23969,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrpcLCRA9TVsSAnZWagAAE3UQAJefFeyZyt5/x/NnQRrV\nGSrb0bIS078OJSo53SnYEnVeQzv9AZy9qdNrwgmSiT5DEIOljy/F3zV1Szpe\nNRF1p5jR7RAkmFJtb1GIZeSa6sOBrT/j1VOGkNMAEtMoguOPwFFH21/WIEY0\nq+mRwQg5GjeGYpnqMvbaEWye05VGTgfob0xnPECE6WTeZ9T3B4ntCeAtmpB+\nLbeYvbG2IRWubtq4mrcZe624pFcJQR0qhwKnAKwgZ/ohGmZP70qBucoDW9nG\nhK232wubB00jbVauYAXUF5rRjrl4ma7+hjKxfkQ12pnnKJrOwg4KdyTIMah/\nHXVtVF9KOvu+3PgPDFis28OcNQP3x4SnXp+O7hEL5wlJN1G62mXuZbQFf7iv\n/OFDTiHI1Co/ZveXtXbcQrRyI9SDBzKXWRKKcF9gT4ua/kjemNZP/am2gS4k\nM5OkKkzZgN0faLzDuf4SCxcyrtyzXbBAco+0sflpZ7Hsh8CBQa+/76OtD0xX\nUSLjmxovk4hc89nEajHyvVogXlpIkKHQ4KqOcaKoyIWKJ3g+dQzujyCy+jZc\nPXMqgc0mh6hOXjUKA6ftHNsDVE7Bj33KIdvrcSgAyP52WgwswXyNdCX44+n4\nyCGONtNK7Qh0KWxEqlg7S/MYHaIt0Hbyqese53hiGBL+df6lxKn6P2gXPQh2\nbuN7\r\n=dNM7\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest"},"main":"lib/index.js","husky":{"hooks":{"pre-push":"npm test","pre-commit":"lint-staged"}},"types":"lib/index.d.ts","gitHead":"28d408e0632340850ca8e0294583dbc99206d631","scripts":{"test":"run-s test:*","prepare":"tsc -p tsconfig.build.json --declaration --outDir lib/","test:tsc":"tsc --noEmit","test:jest":"jest --coverage","test:eslint":"eslint --ext js,ts .","test:prettier":"prettier --check \"**/*.{js,ts,json}\""},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"prettier":{"semi":false,"printWidth":100,"arrowParens":"avoid"},"repository":{"url":"git+https://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"6.14.6","description":"Node bindings to ffmpeg command, exposing stream based API","directories":{},"lint-staged":{"*.{js,ts}":["eslint --fix"],"*.{js,ts,json,md}":["prettier --write"]},"_nodeVersion":"12.18.3","dependencies":{"debug":"^4.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.6.3","husky":"^4.3.0","eslint":"^7.13.0","mkdirp":"^1.0.4","rimraf":"^3.0.2","is-mime":"^0.3.0","ts-jest":"^26.4.4","prettier":"^2.1.2","typescript":"^4.0.5","@types/jest":"^26.0.15","@types/node":"^14.14.7","lint-staged":"^10.5.1","npm-run-all":"^4.1.5","@types/debug":"^4.1.5","@types/mkdirp":"^1.0.1","@types/rimraf":"^3.0.0","eslint-config-prettier":"^6.15.0","@typescript-eslint/parser":"^4.7.0","@typescript-eslint/eslint-plugin":"^4.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ffmpeg-stream_0.7.0_1605277450994_0.03569451117174394","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"ffmpeg-stream","version":"1.0.0","keywords":["ffmpeg","convert","transcode","media","video"],"author":{"name":"phaux"},"license":"MIT","_id":"ffmpeg-stream@1.0.0","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"homepage":"https://github.com/phaux/node-ffmpeg-stream#readme","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"dist":{"shasum":"019f30cf554959039e6ac91579d25668bc247441","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-1.0.0.tgz","fileCount":4,"integrity":"sha512-gEW7QAaCGTlpq8uRl8eAVtwTnCnfiuTr0AjpVqTDpHPhUMzBO0ObixkiEzTSRbliExCwptwbvpLZPCTUTQOJzA==","signatures":[{"sig":"MEUCIQC1fKfO59rKc14W4kc9eXw/lKYt/PmUoauz5afUT/CYhgIgZ/RVL510gdWiyxUgiafUt/fcboJRCz0MshKozD2idzk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33216},"main":"./lib/index.js","type":"module","types":"./lib/index.d.ts","exports":"./lib/index.js","gitHead":"ec51bddf1d418a105696bc094bb145843e5eb738","scripts":{"fix":"eslint --fix . && prettier --write .","test":"node --test --test-timeout 10000 --test-reporter spec --test-reporter-destination stdout --experimental-test-coverage --test-reporter lcov --test-reporter-destination lcov.info && tsc --noEmit && eslint .","prepare":"tsc -p tsconfig.build.json"},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"prettier":{"semi":false,"printWidth":100,"arrowParens":"avoid"},"repository":{"url":"git+https://github.com/phaux/node-ffmpeg-stream.git","type":"git"},"_npmVersion":"10.8.2","description":"Node bindings to ffmpeg command, exposing stream based API","directories":{},"_nodeVersion":"22.5.1","dependencies":{"debug":"^4.2.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","prettier":"^3.3.2","file-type":"^19.0.0","typescript":"^5.5.3","@types/node":"^22.0.2","@types/debug":"^4.1.5","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ffmpeg-stream_1.0.0_1722700849893_0.24278111714583406","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"ffmpeg-stream","version":"1.0.1","description":"Node bindings to ffmpeg command, exposing stream based API","author":{"name":"phaux"},"repository":{"type":"git","url":"git+https://github.com/phaux/node-ffmpeg-stream.git"},"license":"MIT","type":"module","keywords":["ffmpeg","convert","transcode","media","video"],"main":"./lib/index.js","exports":"./lib/index.js","scripts":{"prepare":"tsc -p tsconfig.build.json","test":"node --test --test-timeout 10000 --test-reporter spec --test-reporter-destination stdout --test-reporter lcov --test-reporter-destination lcov.info && tsc --noEmit"},"prettier":{"arrowParens":"avoid","printWidth":100,"semi":false},"devDependencies":{"@types/debug":"^4.1.5","@types/node":"^22.0.2","file-type":"^20.0.1","prettier":"^3.3.2","typescript":"^5.5.3"},"dependencies":{"debug":"^4.2.0"},"_id":"ffmpeg-stream@1.0.1","gitHead":"c4a11a9ccb7bf6d663059909cd5a0ecfa3a9f121","types":"./lib/index.d.ts","bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"homepage":"https://github.com/phaux/node-ffmpeg-stream#readme","_nodeVersion":"23.11.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-xgZ15oZOi6zMd+zhHZPBmAHsGIzCklM+HBNkKtOcpds0efzjYoZUD2U1IWYXByRvSdhr2ypTkH7h3Ri/8cUQJA==","shasum":"5fccbf861a269949999e821dbfe6f4b430bba298","tarball":"https://registry.npmjs.org/ffmpeg-stream/-/ffmpeg-stream-1.0.1.tgz","fileCount":4,"unpackedSize":32973,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCLh7QGGgjRj8ssuBl1XKH2NlkpOe1lMiN1BmuegJ40wQIgUUB5yvpmegCUMtYt/VtTLU4FBwkwsVG35Hoz1I0bx0Q="}]},"_npmUser":{"name":"phaux","email":"phaux4@gmail.com"},"directories":{},"maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ffmpeg-stream_1.0.1_1746283655485_0.05012056455857339"},"_hasShrinkwrap":false}},"time":{"created":"2015-05-21T11:34:05.434Z","modified":"2025-05-03T14:47:35.877Z","0.1.0":"2015-05-21T11:34:05.434Z","0.2.0":"2015-06-27T15:23:17.122Z","0.2.1":"2015-06-27T20:31:29.453Z","0.3.0":"2015-08-02T20:32:20.433Z","0.4.0":"2016-12-02T20:52:11.165Z","0.5.0":"2016-12-02T21:03:01.873Z","0.6.0":"2019-08-29T00:08:52.141Z","0.7.0":"2020-11-13T14:24:11.143Z","1.0.0":"2024-08-03T16:00:50.086Z","1.0.1":"2025-05-03T14:47:35.690Z"},"bugs":{"url":"https://github.com/phaux/node-ffmpeg-stream/issues"},"author":{"name":"phaux"},"license":"MIT","homepage":"https://github.com/phaux/node-ffmpeg-stream#readme","keywords":["ffmpeg","convert","transcode","media","video"],"repository":{"type":"git","url":"git+https://github.com/phaux/node-ffmpeg-stream.git"},"description":"Node bindings to ffmpeg command, exposing stream based API","maintainers":[{"name":"phaux","email":"phaux4@gmail.com"}],"readme":"# FFmpeg-Stream\n\n[![npm](https://img.shields.io/npm/v/ffmpeg-stream)](https://www.npmjs.com/package/ffmpeg-stream)\n[![Codecov](https://img.shields.io/codecov/c/gh/phaux/node-ffmpeg-stream)](https://app.codecov.io/gh/phaux/node-ffmpeg-stream)\n\nNode bindings to ffmpeg command, exposing stream based API.\n\n> [!NOTE]\n> FFmpeg must be installed and available in `PATH`.\n> You can set a custom ffmpeg path via an argument (default is just `ffmpeg`).\n\n## Examples\n\n```js\nimport { Converter } from \"ffmpeg-stream\"\nimport { createReadStream, createWriteStream } from \"node:fs\"\n\nasync function convert() {\n  const converter = new Converter()\n\n  // get a writable input stream and pipe an image file to it\n  const converterInput = converter.createInputStream({\n    f: \"image2pipe\",\n    vcodec: \"mjpeg\",\n  })\n  createReadStream(`${__dirname}/cat.jpg`).pipe(converterInput)\n\n  // create an output stream, crop/scale image, save to file via node stream\n  const converterOutput = converter.createOutputStream({\n    f: \"image2\",\n    vcodec: \"mjpeg\",\n    vf: \"crop=300:300,scale=100:100\",\n  })\n  converterOutput.pipe(createWriteStream(`${__dirname}/cat_thumb.jpg`))\n\n  // same, but save to file directly from ffmpeg\n  converter.createOutputToFile(`${__dirname}/cat_full.jpg`, {\n    vf: \"crop=300:300\",\n  })\n\n  // start processing\n  await converter.run()\n}\n```\n\n# API\n\n- **class** `Converter`\n\n  Creates a new instance of the ffmpeg converter class.\n  Converting won't start until `run()` method is called.\n\n  - **method** `createInputStream(options: Options): stream.Writable`\n\n    Defines an ffmpeg input stream.\n    Remember to specify the [`f` option](https://ffmpeg.org/ffmpeg.html#Main-options), which specifies the format of the input data.\n    The returned stream is a writable stream.\n\n  - **method** `createInputFromFile(file: string, options: Options): void`\n\n    Defines an ffmpeg input using specified path.\n    This is the same as specifying an input on the command line.\n\n  - **method** `createBufferedInputStream(options: Options): stream.Writable`\n\n    This is a mix of `createInputStream` and `createInputFromFile`.\n    It creates a temporary file and instructs ffmpeg to use it,\n    then it returns a writable stream attached to that file.\n    Using this method will cause a huge delay.\n\n  - **method** `createOutputStream(options: Options): stream.Readable`\n\n    Defines an ffmpeg output stream.\n    Remember to specify the [`f` option](https://ffmpeg.org/ffmpeg.html#Main-options), which specifies the format of the output data.\n    The returned stream is a readable stream.\n\n  - **method** `createOutputToFile(file: string, options: Options): void`\n\n    Defines an ffmpeg output using specified path.\n    This is the same as specifying an output on the command line.\n\n  - **method** `createBufferedOutputStream(options: Options): stream.Readable`\n\n    This is a mix of `createOutputStream` and `createOutputToFile`.\n    It creates a temporary file and instructs ffmpeg to use it,\n    then it returns a readable stream attached to that file.\n    Using this method will cause a huge delay.\n\n  - **method** `run(): Promise<void>`\n\n    Starts the ffmpeg process.\n    Returns a Promise which resolves on normal exit or kill, but rejects on ffmpeg error.\n\n  - **method** `kill(): void`\n\n    Kills the ffmpeg process.\n\n- **type** `Options`\n\n  Object of options which you normally pass to the ffmpeg command in the terminal.\n  Documentation for individual options can be found at [ffmpeg site](https://ffmpeg.org/ffmpeg.html) in audio and video category.\n  For boolean options specify `true` or `false`.\n  If you'd like to specify the same argument multiple times you can do so by providing an array of values. E.g. `{ map: [\"0:v\", \"1:a\"] }`\n\n# FAQ\n\n## How to get video duration and other stats\n\nYou can use `ffprobe` command for now. It might be implemented in the library in the future, though.\n\n## Is there a `progress` or `onFrameEmitted` event\n\nCurrently, no.\n\n## Something doesn't work\n\nTry running your program with `DEBUG=ffmpeg-stream` environment variable.\nIt will print the ffmpeg command it executes and all the ffmpeg logs.\nThe command usually looks something like `ffmpeg -f … -i pipe:3 -f … pipe:4`.\n`pipe:number` means it uses standard input/output instead of a file.\n\n## Error: Muxer does not support non seekable output\n\nWhen getting error similar to this:\n\n```\n  [mp4 @ 0000000000e4db00] muxer does not support non seekable output\n  Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument\n  Error initializing output stream 0:1 --\n  encoded 0 frames\n  Conversion failed!\n\n    at ChildProcess.<anonymous> (<DirPath>\\node_modules\\ffmpeg-stream\\lib\\index.js:215:27)\n    at emitTwo (events.js:106:13)\n    at ChildProcess.emit (events.js:191:7)\n    at Process.ChildProcess._handle.onexit (internal/child_process.js:215:12)\n```\n\nffmpeg says that the combination of options you specified doesn't support streaming. You can experiment with calling ffmpeg directly and specifying `-` or `pipe:1` as output file. Maybe some other options or different format will work. Streaming sequence of JPEGs over websockets worked flawlessly for me (`{ f: \"image2pipe\", vcodec: \"mjpeg\" }`).\n\nYou can also use `createBufferedOutputStream`. That tells the library to save output to a temporary file and then create a node stream from that file. It wont start producing data until the conversion is complete, though.\n\n## How to get individual frame data\n\nYou have to set output format to mjpeg and then split the stream manually by looking at the bytes. You can implement a transform stream which does this:\n\n```js\nimport { Transform } from \"node:stream\"\n\nclass ExtractFrames extends Transform {\n  constructor(magicNumberHex) {\n    super({ readableObjectMode: true })\n    this.magicNumber = Buffer.from(magicNumberHex, \"hex\")\n    this.currentData = Buffer.alloc(0)\n  }\n\n  _transform(newData, encoding, done) {\n    // Add new data\n    this.currentData = Buffer.concat([this.currentData, newData])\n\n    // Find frames in current data\n    while (true) {\n      // Find the start of a frame\n      const startIndex = this.currentData.indexOf(this.magicNumber)\n      if (startIndex < 0) break // start of frame not found\n\n      // Find the start of the next frame\n      const endIndex = this.currentData.indexOf(\n        this.magicNumber,\n        startIndex + this.magicNumber.length,\n      )\n      if (endIndex < 0) break // we haven't got the whole frame yet\n\n      // Handle found frame\n      this.push(this.currentData.slice(startIndex, endIndex)) // emit a frame\n      this.currentData = this.currentData.slice(endIndex) // remove frame data from current data\n      if (startIndex > 0) console.error(`Discarded ${startIndex} bytes of invalid data`)\n    }\n\n    done()\n  }\n\n  _flush(done) {\n    this.push(this.currentData)\n    done()\n  }\n}\n```\n\nAnd then use it like that:\n\n```js\nimport { Converter } from \"ffmpeg-stream\"\n\nconst converter = new Converter()\n\nconverter\n  .createOutputStream({ f: \"image2pipe\", vcodec: \"mjpeg\" })\n  .pipe(new ExtractFrames(\"FFD8FF\")) // use jpg magic number as delimiter\n  .on(\"data\", frameData => {\n    /* do things with frame data (instance of Buffer) */\n  })\n\nconverter.run()\n```\n\n## How to create an animation from a set of image files\n\n> I have images in Amazon S3 bucket (private) so I'm using their SDK to download those.\n> I get the files in Buffer objects.\n> Is there any way I can use your package to create a video out of it?\n>\n> So far I've been downloading the files and then using the following command:\n> `ffmpeg -framerate 30 -pattern_type glob -i '*.jpg' -c:v libx264 -pix_fmt yuv420p out.mp4`\n>\n> But now want to do it from my node js application automatically.\n\n```js\nimport { Converter } from \"ffmpeg-stream\"\n\nconst frames = [\"frame1.jpg\", \"frame2.jpg\", ...etc]\n\n// create converter\nconst converter = new Converter()\n\n// create input writable stream (the jpeg frames)\nconst converterInput = converter.createInputStream({ f: \"image2pipe\", r: 30 })\n\n// create output to file (mp4 video)\nconverter.createOutputToFile(\"out.mp4\", {\n  vcodec: \"libx264\",\n  pix_fmt: \"yuv420p\",\n})\n\n// start the converter, save the promise for later\nconst convertingFinished = converter.run()\n\n// pipe all the frames to the converter sequentially\nfor (const filename of frames) {\n  // create a promise for every frame and await it\n  await new Promise((resolve, reject) => {\n    s3.getObject({ Bucket: \"...\", Key: filename })\n      .createReadStream()\n      .pipe(converterInput, { end: false }) // pipe to converter, but don't end the input yet\n      .on(\"end\", resolve) // resolve the promise after the frame finishes\n      .on(\"error\", reject)\n  })\n}\nconverterInput.end()\n\n// await until the whole process finished just in case\nawait convertingFinished\n```\n\n## How to stream a video when there's data, otherwise an intermission image\n\nYou can turn your main stream into series of `jpeg` images with output format `mjpeg` and combine it with static image by repeatedly piping a single `jpeg` image when there's no data from main stream.\nThen pipe it to second ffmpeg process which combines `jpeg` images into video.\n\n```js\nimport * as fs from \"node:fs\"\nimport { Converter } from \"ffmpeg-stream\"\n\n// create the joiner ffmpeg process (frames to video)\nconst joiner = new Converter()\nconst joinerInput = joiner.createInputStream({ f: \"mjpeg\" })\nconst joinerOutput = joiner.createOutputStream({ f: \"whatever format you want\" })\njoinerOutput.pipe(/* wherever you want */)\n\njoiner.run()\n\n// remember if we are streaming currently\nlet streaming = false\n\n/**\n * A function which streams a single video.\n *\n * @param {import(\"node:stream\").Readable} incomingStream - The video stream.\n * @param {string} format - The format of the video stream.\n *\n * @returns {Promise<void>} Promise which resolves when the stream ends.\n */\nasync function streamVideo(incomingStream, format) {\n  if (streaming) throw new Error(\"We are already streaming something else\")\n  streaming = true\n\n  // create the splitter ffmpeg process (video to frames)\n  const splitter = new Converter()\n\n  // pipe video to splitter process\n  incomingStream.pipe(splitter.createInputStream({ f: format }))\n\n  // get jpegs and pipe them to joiner process\n  splitter.createOutputStream({ f: \"mjpeg\" }).pipe(joinerInput, { end: false })\n\n  try {\n    await splitter.run()\n  } finally {\n    streaming = false\n  }\n}\n\nsetInterval(() => {\n  // if we are streaming - do nothing\n  if (streaming) return\n\n  // pipe a single jpeg file 30 times per second into the joiner process\n  // TODO: don't actually read the file 30 times per second\n  fs.createReadStream(\"intermission_pic.jpg\").pipe(joinerInput, { end: false })\n}, 1000 / 30)\n```\n\n## I want intermission image with audio and other complicated stuff\n\nYou should probably use [beamcoder](https://github.com/Streampunk/beamcoder) instead.\n","readmeFilename":"README.md","users":{"hualei":true,"rocket0191":true}}