larkup 0.1.46 → 0.1.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +12 -12
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +16 -16
- package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/server/app/analytics.html +1 -1
- package/.next/server/app/analytics.rsc +17 -17
- package/.next/server/app/analytics.segments/_full.segment.rsc +17 -17
- package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/_index.segment.rsc +11 -11
- package/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/server/app/api/chat/route.js +9 -9
- package/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/server/app/api/deploy/ssh/route.js +2 -2
- package/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/doc-editor/edit/route.js +2 -2
- package/.next/server/app/api/doc-editor/export/route.js +2 -2
- package/.next/server/app/api/doc-editor/extract-text/route.js +2 -2
- package/.next/server/app/api/doc-editor/parse/route.js +1 -1
- package/.next/server/app/api/doc-editor/restore/route.js +2 -2
- package/.next/server/app/api/document/sign/route.js +3 -3
- package/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/route.js.nft.json +1 -1
- package/.next/server/app/api/media/process/route.js.nft.json +1 -1
- package/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/server/app/api/parse-file/route.js +2 -2
- package/.next/server/app/api/server/download/route.js +1 -1
- package/.next/server/app/api/server/generate/route.js +2 -2
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +17 -17
- package/.next/server/app/chat.segments/_full.segment.rsc +17 -17
- package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_index.segment.rsc +11 -11
- package/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/server/app/data.html +1 -1
- package/.next/server/app/data.rsc +17 -17
- package/.next/server/app/data.segments/_full.segment.rsc +17 -17
- package/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/server/app/data.segments/_index.segment.rsc +11 -11
- package/.next/server/app/data.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +16 -16
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +18 -18
- package/.next/server/app/settings.segments/_full.segment.rsc +18 -18
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +11 -11
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/chunks/[root-of-the-server]__05707i3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0vmcld0._.js +3 -0
- package/.next/{standalone/apps/web/.next/server/chunks/[root-of-the-server]__08f60c7._.js → server/chunks/[root-of-the-server]__1e8p5bd._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1ks-3_h._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1lhfkyh._.js +1 -1
- package/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
- package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/server/chunks/packages_tools_video-audio_dist_ffmpeg-spawn_0by2bau.js +3 -0
- package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +16 -16
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/api/chat/route.js +9 -9
- package/.next/standalone/apps/web/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/doc-editor/edit/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/doc-editor/export/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/doc-editor/extract-text/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/doc-editor/parse/route.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/doc-editor/restore/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/document/sign/route.js +3 -3
- package/.next/standalone/apps/web/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/marketplace/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/parse-file/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/api/server/download/route.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/server/generate/route.js +2 -2
- package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/index.rsc +16 -16
- package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +11 -11
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__05707i3._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0vmcld0._.js +3 -0
- package/.next/{server/chunks/[root-of-the-server]__08f60c7._.js → standalone/apps/web/.next/server/chunks/[root-of-the-server]__1e8p5bd._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1ks-3_h._.js +3 -0
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1lhfkyh._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/packages_tools_video-audio_dist_ffmpeg-spawn_0by2bau.js +3 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
- package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/{0wy4vhj2gft06.js → 2azppfcsqga3r.js} +1 -1
- package/.next/standalone/apps/web/CHANGELOG.md +9 -0
- package/.next/standalone/apps/web/components/update-banner.tsx +2 -2
- package/.next/standalone/apps/web/package.json +1 -1
- package/.next/standalone/apps/web/server.js +1 -1
- package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
- package/.next/standalone/packages/tools/video-audio/dist/audio-processor.js +30 -32
- package/.next/standalone/packages/tools/video-audio/dist/ffmpeg-spawn.js +127 -0
- package/.next/standalone/packages/tools/video-audio/dist/video-processor.js +95 -113
- package/.next/standalone/packages/tools/video-audio/package.json +2 -7
- package/.next/standalone/packages/tools/video-audio/src/audio-processor.ts +30 -31
- package/.next/standalone/packages/tools/video-audio/src/ffmpeg-spawn.ts +176 -0
- package/.next/standalone/packages/tools/video-audio/src/video-processor.ts +88 -116
- package/.next/static/chunks/{0wy4vhj2gft06.js → 2azppfcsqga3r.js} +1 -1
- package/CHANGELOG.md +9 -0
- package/LICENSE +176 -0
- package/components/update-banner.tsx +2 -2
- package/package.json +4 -4
- package/.next/server/chunks/[externals]__1_tvo45._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__010rwkn._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0xbvdcw._.js +0 -3
- package/.next/server/chunks/node_modules__pnpm_0ddqx71._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/[externals]__1_tvo45._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__010rwkn._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0xbvdcw._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/node_modules__pnpm_0ddqx71._.js +0 -3
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/capabilities.js +0 -665
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/ffprobe.js +0 -261
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/fluent-ffmpeg.js +0 -226
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/audio.js +0 -178
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/custom.js +0 -212
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/inputs.js +0 -178
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/misc.js +0 -41
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/output.js +0 -162
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/video.js +0 -184
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/options/videosize.js +0 -291
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/divx.js +0 -14
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/flashvideo.js +0 -16
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/presets/podcast.js +0 -16
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/processor.js +0 -662
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/recipes.js +0 -456
- package/.next/standalone/node_modules/.pnpm/fluent-ffmpeg@2.1.3/node_modules/fluent-ffmpeg/lib/utils.js +0 -455
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/CHANGELOG.md +0 -152
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/LICENSE +0 -15
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/README.md +0 -51
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/bin/which +0 -52
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/package.json +0 -30
- package/.next/standalone/node_modules/.pnpm/which@1.3.1/node_modules/which/which.js +0 -135
- /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_buildManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_ssgManifest.js +0 -0
- /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_buildManifest.js +0 -0
- /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{HU74sZ8oKr0VlhdDfm98x → PM7-3u8cSkShjD80zaJ4l}/_ssgManifest.js +0 -0
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
/*jshint node:true, laxcomma:true*/
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var spawn = require('child_process').spawn;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
function legacyTag(key) { return key.match(/^TAG:/); }
|
|
8
|
-
function legacyDisposition(key) { return key.match(/^DISPOSITION:/); }
|
|
9
|
-
|
|
10
|
-
function parseFfprobeOutput(out) {
|
|
11
|
-
var lines = out.split(/\r\n|\r|\n/);
|
|
12
|
-
|
|
13
|
-
lines = lines.filter(function (line) {
|
|
14
|
-
return line.length > 0;
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
var data = {
|
|
18
|
-
streams: [],
|
|
19
|
-
format: {},
|
|
20
|
-
chapters: []
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
function parseBlock(name) {
|
|
24
|
-
var data = {};
|
|
25
|
-
|
|
26
|
-
var line = lines.shift();
|
|
27
|
-
while (typeof line !== 'undefined') {
|
|
28
|
-
if (line.toLowerCase() == '[/'+name+']') {
|
|
29
|
-
return data;
|
|
30
|
-
} else if (line.match(/^\[/)) {
|
|
31
|
-
line = lines.shift();
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
var kv = line.match(/^([^=]+)=(.*)$/);
|
|
36
|
-
if (kv) {
|
|
37
|
-
if (!(kv[1].match(/^TAG:/)) && kv[2].match(/^[0-9]+(\.[0-9]+)?$/)) {
|
|
38
|
-
data[kv[1]] = Number(kv[2]);
|
|
39
|
-
} else {
|
|
40
|
-
data[kv[1]] = kv[2];
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
line = lines.shift();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return data;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
var line = lines.shift();
|
|
51
|
-
while (typeof line !== 'undefined') {
|
|
52
|
-
if (line.match(/^\[stream/i)) {
|
|
53
|
-
var stream = parseBlock('stream');
|
|
54
|
-
data.streams.push(stream);
|
|
55
|
-
} else if (line.match(/^\[chapter/i)) {
|
|
56
|
-
var chapter = parseBlock('chapter');
|
|
57
|
-
data.chapters.push(chapter);
|
|
58
|
-
} else if (line.toLowerCase() === '[format]') {
|
|
59
|
-
data.format = parseBlock('format');
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
line = lines.shift();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return data;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
module.exports = function(proto) {
|
|
71
|
-
/**
|
|
72
|
-
* A callback passed to the {@link FfmpegCommand#ffprobe} method.
|
|
73
|
-
*
|
|
74
|
-
* @callback FfmpegCommand~ffprobeCallback
|
|
75
|
-
*
|
|
76
|
-
* @param {Error|null} err error object or null if no error happened
|
|
77
|
-
* @param {Object} ffprobeData ffprobe output data; this object
|
|
78
|
-
* has the same format as what the following command returns:
|
|
79
|
-
*
|
|
80
|
-
* `ffprobe -print_format json -show_streams -show_format INPUTFILE`
|
|
81
|
-
* @param {Array} ffprobeData.streams stream information
|
|
82
|
-
* @param {Object} ffprobeData.format format information
|
|
83
|
-
*/
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Run ffprobe on last specified input
|
|
87
|
-
*
|
|
88
|
-
* @method FfmpegCommand#ffprobe
|
|
89
|
-
* @category Metadata
|
|
90
|
-
*
|
|
91
|
-
* @param {?Number} [index] 0-based index of input to probe (defaults to last input)
|
|
92
|
-
* @param {?String[]} [options] array of output options to return
|
|
93
|
-
* @param {FfmpegCommand~ffprobeCallback} callback callback function
|
|
94
|
-
*
|
|
95
|
-
*/
|
|
96
|
-
proto.ffprobe = function() {
|
|
97
|
-
var input, index = null, options = [], callback;
|
|
98
|
-
|
|
99
|
-
// the last argument should be the callback
|
|
100
|
-
var callback = arguments[arguments.length - 1];
|
|
101
|
-
|
|
102
|
-
var ended = false
|
|
103
|
-
function handleCallback(err, data) {
|
|
104
|
-
if (!ended) {
|
|
105
|
-
ended = true;
|
|
106
|
-
callback(err, data);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
// map the arguments to the correct variable names
|
|
111
|
-
switch (arguments.length) {
|
|
112
|
-
case 3:
|
|
113
|
-
index = arguments[0];
|
|
114
|
-
options = arguments[1];
|
|
115
|
-
break;
|
|
116
|
-
case 2:
|
|
117
|
-
if (typeof arguments[0] === 'number') {
|
|
118
|
-
index = arguments[0];
|
|
119
|
-
} else if (Array.isArray(arguments[0])) {
|
|
120
|
-
options = arguments[0];
|
|
121
|
-
}
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (index === null) {
|
|
127
|
-
if (!this._currentInput) {
|
|
128
|
-
return handleCallback(new Error('No input specified'));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
input = this._currentInput;
|
|
132
|
-
} else {
|
|
133
|
-
input = this._inputs[index];
|
|
134
|
-
|
|
135
|
-
if (!input) {
|
|
136
|
-
return handleCallback(new Error('Invalid input index'));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Find ffprobe
|
|
141
|
-
this._getFfprobePath(function(err, path) {
|
|
142
|
-
if (err) {
|
|
143
|
-
return handleCallback(err);
|
|
144
|
-
} else if (!path) {
|
|
145
|
-
return handleCallback(new Error('Cannot find ffprobe'));
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
var stdout = '';
|
|
149
|
-
var stdoutClosed = false;
|
|
150
|
-
var stderr = '';
|
|
151
|
-
var stderrClosed = false;
|
|
152
|
-
|
|
153
|
-
// Spawn ffprobe
|
|
154
|
-
var src = input.isStream ? 'pipe:0' : input.source;
|
|
155
|
-
var ffprobe = spawn(path, ['-show_streams', '-show_format'].concat(options, src), {windowsHide: true});
|
|
156
|
-
|
|
157
|
-
if (input.isStream) {
|
|
158
|
-
// Skip errors on stdin. These get thrown when ffprobe is complete and
|
|
159
|
-
// there seems to be no way hook in and close stdin before it throws.
|
|
160
|
-
ffprobe.stdin.on('error', function(err) {
|
|
161
|
-
if (['ECONNRESET', 'EPIPE', 'EOF'].indexOf(err.code) >= 0) { return; }
|
|
162
|
-
handleCallback(err);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// Once ffprobe's input stream closes, we need no more data from the
|
|
166
|
-
// input
|
|
167
|
-
ffprobe.stdin.on('close', function() {
|
|
168
|
-
input.source.pause();
|
|
169
|
-
input.source.unpipe(ffprobe.stdin);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
input.source.pipe(ffprobe.stdin);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
ffprobe.on('error', callback);
|
|
176
|
-
|
|
177
|
-
// Ensure we wait for captured streams to end before calling callback
|
|
178
|
-
var exitError = null;
|
|
179
|
-
function handleExit(err) {
|
|
180
|
-
if (err) {
|
|
181
|
-
exitError = err;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (processExited && stdoutClosed && stderrClosed) {
|
|
185
|
-
if (exitError) {
|
|
186
|
-
if (stderr) {
|
|
187
|
-
exitError.message += '\n' + stderr;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return handleCallback(exitError);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Process output
|
|
194
|
-
var data = parseFfprobeOutput(stdout);
|
|
195
|
-
|
|
196
|
-
// Handle legacy output with "TAG:x" and "DISPOSITION:x" keys
|
|
197
|
-
[data.format].concat(data.streams).forEach(function(target) {
|
|
198
|
-
if (target) {
|
|
199
|
-
var legacyTagKeys = Object.keys(target).filter(legacyTag);
|
|
200
|
-
|
|
201
|
-
if (legacyTagKeys.length) {
|
|
202
|
-
target.tags = target.tags || {};
|
|
203
|
-
|
|
204
|
-
legacyTagKeys.forEach(function(tagKey) {
|
|
205
|
-
target.tags[tagKey.substr(4)] = target[tagKey];
|
|
206
|
-
delete target[tagKey];
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
var legacyDispositionKeys = Object.keys(target).filter(legacyDisposition);
|
|
211
|
-
|
|
212
|
-
if (legacyDispositionKeys.length) {
|
|
213
|
-
target.disposition = target.disposition || {};
|
|
214
|
-
|
|
215
|
-
legacyDispositionKeys.forEach(function(dispositionKey) {
|
|
216
|
-
target.disposition[dispositionKey.substr(12)] = target[dispositionKey];
|
|
217
|
-
delete target[dispositionKey];
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
handleCallback(null, data);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Handle ffprobe exit
|
|
228
|
-
var processExited = false;
|
|
229
|
-
ffprobe.on('exit', function(code, signal) {
|
|
230
|
-
processExited = true;
|
|
231
|
-
|
|
232
|
-
if (code) {
|
|
233
|
-
handleExit(new Error('ffprobe exited with code ' + code));
|
|
234
|
-
} else if (signal) {
|
|
235
|
-
handleExit(new Error('ffprobe was killed with signal ' + signal));
|
|
236
|
-
} else {
|
|
237
|
-
handleExit();
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
// Handle stdout/stderr streams
|
|
242
|
-
ffprobe.stdout.on('data', function(data) {
|
|
243
|
-
stdout += data;
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
ffprobe.stdout.on('close', function() {
|
|
247
|
-
stdoutClosed = true;
|
|
248
|
-
handleExit();
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
ffprobe.stderr.on('data', function(data) {
|
|
252
|
-
stderr += data;
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
ffprobe.stderr.on('close', function() {
|
|
256
|
-
stderrClosed = true;
|
|
257
|
-
handleExit();
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
};
|
|
261
|
-
};
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
/*jshint node:true*/
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var path = require('path');
|
|
5
|
-
var util = require('util');
|
|
6
|
-
var EventEmitter = require('events').EventEmitter;
|
|
7
|
-
|
|
8
|
-
var utils = require('./utils');
|
|
9
|
-
var ARGLISTS = ['_global', '_audio', '_audioFilters', '_video', '_videoFilters', '_sizeFilters', '_complexFilters'];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create an ffmpeg command
|
|
14
|
-
*
|
|
15
|
-
* Can be called with or without the 'new' operator, and the 'input' parameter
|
|
16
|
-
* may be specified as 'options.source' instead (or passed later with the
|
|
17
|
-
* addInput method).
|
|
18
|
-
*
|
|
19
|
-
* @constructor
|
|
20
|
-
* @param {String|ReadableStream} [input] input file path or readable stream
|
|
21
|
-
* @param {Object} [options] command options
|
|
22
|
-
* @param {Object} [options.logger=<no logging>] logger object with 'error', 'warning', 'info' and 'debug' methods
|
|
23
|
-
* @param {Number} [options.niceness=0] ffmpeg process niceness, ignored on Windows
|
|
24
|
-
* @param {Number} [options.priority=0] alias for `niceness`
|
|
25
|
-
* @param {String} [options.presets="fluent-ffmpeg/lib/presets"] directory to load presets from
|
|
26
|
-
* @param {String} [options.preset="fluent-ffmpeg/lib/presets"] alias for `presets`
|
|
27
|
-
* @param {String} [options.stdoutLines=100] maximum lines of ffmpeg output to keep in memory, use 0 for unlimited
|
|
28
|
-
* @param {Number} [options.timeout=<no timeout>] ffmpeg processing timeout in seconds
|
|
29
|
-
* @param {String|ReadableStream} [options.source=<no input>] alias for the `input` parameter
|
|
30
|
-
*/
|
|
31
|
-
function FfmpegCommand(input, options) {
|
|
32
|
-
// Make 'new' optional
|
|
33
|
-
if (!(this instanceof FfmpegCommand)) {
|
|
34
|
-
return new FfmpegCommand(input, options);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
EventEmitter.call(this);
|
|
38
|
-
|
|
39
|
-
if (typeof input === 'object' && !('readable' in input)) {
|
|
40
|
-
// Options object passed directly
|
|
41
|
-
options = input;
|
|
42
|
-
} else {
|
|
43
|
-
// Input passed first
|
|
44
|
-
options = options || {};
|
|
45
|
-
options.source = input;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Add input if present
|
|
49
|
-
this._inputs = [];
|
|
50
|
-
if (options.source) {
|
|
51
|
-
this.input(options.source);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Add target-less output for backwards compatibility
|
|
55
|
-
this._outputs = [];
|
|
56
|
-
this.output();
|
|
57
|
-
|
|
58
|
-
// Create argument lists
|
|
59
|
-
var self = this;
|
|
60
|
-
['_global', '_complexFilters'].forEach(function(prop) {
|
|
61
|
-
self[prop] = utils.args();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// Set default option values
|
|
65
|
-
options.stdoutLines = 'stdoutLines' in options ? options.stdoutLines : 100;
|
|
66
|
-
options.presets = options.presets || options.preset || path.join(__dirname, 'presets');
|
|
67
|
-
options.niceness = options.niceness || options.priority || 0;
|
|
68
|
-
|
|
69
|
-
// Save options
|
|
70
|
-
this.options = options;
|
|
71
|
-
|
|
72
|
-
// Setup logger
|
|
73
|
-
this.logger = options.logger || {
|
|
74
|
-
debug: function() {},
|
|
75
|
-
info: function() {},
|
|
76
|
-
warn: function() {},
|
|
77
|
-
error: function() {}
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
util.inherits(FfmpegCommand, EventEmitter);
|
|
81
|
-
module.exports = FfmpegCommand;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Clone an ffmpeg command
|
|
86
|
-
*
|
|
87
|
-
* This method is useful when you want to process the same input multiple times.
|
|
88
|
-
* It returns a new FfmpegCommand instance with the exact same options.
|
|
89
|
-
*
|
|
90
|
-
* All options set _after_ the clone() call will only be applied to the instance
|
|
91
|
-
* it has been called on.
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* var command = ffmpeg('/path/to/source.avi')
|
|
95
|
-
* .audioCodec('libfaac')
|
|
96
|
-
* .videoCodec('libx264')
|
|
97
|
-
* .format('mp4');
|
|
98
|
-
*
|
|
99
|
-
* command.clone()
|
|
100
|
-
* .size('320x200')
|
|
101
|
-
* .save('/path/to/output-small.mp4');
|
|
102
|
-
*
|
|
103
|
-
* command.clone()
|
|
104
|
-
* .size('640x400')
|
|
105
|
-
* .save('/path/to/output-medium.mp4');
|
|
106
|
-
*
|
|
107
|
-
* command.save('/path/to/output-original-size.mp4');
|
|
108
|
-
*
|
|
109
|
-
* @method FfmpegCommand#clone
|
|
110
|
-
* @return FfmpegCommand
|
|
111
|
-
*/
|
|
112
|
-
FfmpegCommand.prototype.clone = function() {
|
|
113
|
-
var clone = new FfmpegCommand();
|
|
114
|
-
var self = this;
|
|
115
|
-
|
|
116
|
-
// Clone options and logger
|
|
117
|
-
clone.options = this.options;
|
|
118
|
-
clone.logger = this.logger;
|
|
119
|
-
|
|
120
|
-
// Clone inputs
|
|
121
|
-
clone._inputs = this._inputs.map(function(input) {
|
|
122
|
-
return {
|
|
123
|
-
source: input.source,
|
|
124
|
-
options: input.options.clone()
|
|
125
|
-
};
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
// Create first output
|
|
129
|
-
if ('target' in this._outputs[0]) {
|
|
130
|
-
// We have outputs set, don't clone them and create first output
|
|
131
|
-
clone._outputs = [];
|
|
132
|
-
clone.output();
|
|
133
|
-
} else {
|
|
134
|
-
// No outputs set, clone first output options
|
|
135
|
-
clone._outputs = [
|
|
136
|
-
clone._currentOutput = {
|
|
137
|
-
flags: {}
|
|
138
|
-
}
|
|
139
|
-
];
|
|
140
|
-
|
|
141
|
-
['audio', 'audioFilters', 'video', 'videoFilters', 'sizeFilters', 'options'].forEach(function(key) {
|
|
142
|
-
clone._currentOutput[key] = self._currentOutput[key].clone();
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
if (this._currentOutput.sizeData) {
|
|
146
|
-
clone._currentOutput.sizeData = {};
|
|
147
|
-
utils.copy(this._currentOutput.sizeData, clone._currentOutput.sizeData);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
utils.copy(this._currentOutput.flags, clone._currentOutput.flags);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Clone argument lists
|
|
154
|
-
['_global', '_complexFilters'].forEach(function(prop) {
|
|
155
|
-
clone[prop] = self[prop].clone();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
return clone;
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
/* Add methods from options submodules */
|
|
163
|
-
|
|
164
|
-
require('./options/inputs')(FfmpegCommand.prototype);
|
|
165
|
-
require('./options/audio')(FfmpegCommand.prototype);
|
|
166
|
-
require('./options/video')(FfmpegCommand.prototype);
|
|
167
|
-
require('./options/videosize')(FfmpegCommand.prototype);
|
|
168
|
-
require('./options/output')(FfmpegCommand.prototype);
|
|
169
|
-
require('./options/custom')(FfmpegCommand.prototype);
|
|
170
|
-
require('./options/misc')(FfmpegCommand.prototype);
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
/* Add processor methods */
|
|
174
|
-
|
|
175
|
-
require('./processor')(FfmpegCommand.prototype);
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
/* Add capabilities methods */
|
|
179
|
-
|
|
180
|
-
require('./capabilities')(FfmpegCommand.prototype);
|
|
181
|
-
|
|
182
|
-
FfmpegCommand.setFfmpegPath = function(path) {
|
|
183
|
-
(new FfmpegCommand()).setFfmpegPath(path);
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
FfmpegCommand.setFfprobePath = function(path) {
|
|
187
|
-
(new FfmpegCommand()).setFfprobePath(path);
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
FfmpegCommand.setFlvtoolPath = function(path) {
|
|
191
|
-
(new FfmpegCommand()).setFlvtoolPath(path);
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
FfmpegCommand.availableFilters =
|
|
195
|
-
FfmpegCommand.getAvailableFilters = function(callback) {
|
|
196
|
-
(new FfmpegCommand()).availableFilters(callback);
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
FfmpegCommand.availableCodecs =
|
|
200
|
-
FfmpegCommand.getAvailableCodecs = function(callback) {
|
|
201
|
-
(new FfmpegCommand()).availableCodecs(callback);
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
FfmpegCommand.availableFormats =
|
|
205
|
-
FfmpegCommand.getAvailableFormats = function(callback) {
|
|
206
|
-
(new FfmpegCommand()).availableFormats(callback);
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
FfmpegCommand.availableEncoders =
|
|
210
|
-
FfmpegCommand.getAvailableEncoders = function(callback) {
|
|
211
|
-
(new FfmpegCommand()).availableEncoders(callback);
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
/* Add ffprobe methods */
|
|
216
|
-
|
|
217
|
-
require('./ffprobe')(FfmpegCommand.prototype);
|
|
218
|
-
|
|
219
|
-
FfmpegCommand.ffprobe = function(file) {
|
|
220
|
-
var instance = new FfmpegCommand(file);
|
|
221
|
-
instance.ffprobe.apply(instance, Array.prototype.slice.call(arguments, 1));
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
/* Add processing recipes */
|
|
225
|
-
|
|
226
|
-
require('./recipes')(FfmpegCommand.prototype);
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/*jshint node:true*/
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var utils = require('../utils');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/*
|
|
8
|
-
*! Audio-related methods
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
module.exports = function(proto) {
|
|
12
|
-
/**
|
|
13
|
-
* Disable audio in the output
|
|
14
|
-
*
|
|
15
|
-
* @method FfmpegCommand#noAudio
|
|
16
|
-
* @category Audio
|
|
17
|
-
* @aliases withNoAudio
|
|
18
|
-
* @return FfmpegCommand
|
|
19
|
-
*/
|
|
20
|
-
proto.withNoAudio =
|
|
21
|
-
proto.noAudio = function() {
|
|
22
|
-
this._currentOutput.audio.clear();
|
|
23
|
-
this._currentOutput.audioFilters.clear();
|
|
24
|
-
this._currentOutput.audio('-an');
|
|
25
|
-
|
|
26
|
-
return this;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Specify audio codec
|
|
32
|
-
*
|
|
33
|
-
* @method FfmpegCommand#audioCodec
|
|
34
|
-
* @category Audio
|
|
35
|
-
* @aliases withAudioCodec
|
|
36
|
-
*
|
|
37
|
-
* @param {String} codec audio codec name
|
|
38
|
-
* @return FfmpegCommand
|
|
39
|
-
*/
|
|
40
|
-
proto.withAudioCodec =
|
|
41
|
-
proto.audioCodec = function(codec) {
|
|
42
|
-
this._currentOutput.audio('-acodec', codec);
|
|
43
|
-
|
|
44
|
-
return this;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Specify audio bitrate
|
|
50
|
-
*
|
|
51
|
-
* @method FfmpegCommand#audioBitrate
|
|
52
|
-
* @category Audio
|
|
53
|
-
* @aliases withAudioBitrate
|
|
54
|
-
*
|
|
55
|
-
* @param {String|Number} bitrate audio bitrate in kbps (with an optional 'k' suffix)
|
|
56
|
-
* @return FfmpegCommand
|
|
57
|
-
*/
|
|
58
|
-
proto.withAudioBitrate =
|
|
59
|
-
proto.audioBitrate = function(bitrate) {
|
|
60
|
-
this._currentOutput.audio('-b:a', ('' + bitrate).replace(/k?$/, 'k'));
|
|
61
|
-
return this;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Specify audio channel count
|
|
67
|
-
*
|
|
68
|
-
* @method FfmpegCommand#audioChannels
|
|
69
|
-
* @category Audio
|
|
70
|
-
* @aliases withAudioChannels
|
|
71
|
-
*
|
|
72
|
-
* @param {Number} channels channel count
|
|
73
|
-
* @return FfmpegCommand
|
|
74
|
-
*/
|
|
75
|
-
proto.withAudioChannels =
|
|
76
|
-
proto.audioChannels = function(channels) {
|
|
77
|
-
this._currentOutput.audio('-ac', channels);
|
|
78
|
-
return this;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Specify audio frequency
|
|
84
|
-
*
|
|
85
|
-
* @method FfmpegCommand#audioFrequency
|
|
86
|
-
* @category Audio
|
|
87
|
-
* @aliases withAudioFrequency
|
|
88
|
-
*
|
|
89
|
-
* @param {Number} freq audio frequency in Hz
|
|
90
|
-
* @return FfmpegCommand
|
|
91
|
-
*/
|
|
92
|
-
proto.withAudioFrequency =
|
|
93
|
-
proto.audioFrequency = function(freq) {
|
|
94
|
-
this._currentOutput.audio('-ar', freq);
|
|
95
|
-
return this;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Specify audio quality
|
|
101
|
-
*
|
|
102
|
-
* @method FfmpegCommand#audioQuality
|
|
103
|
-
* @category Audio
|
|
104
|
-
* @aliases withAudioQuality
|
|
105
|
-
*
|
|
106
|
-
* @param {Number} quality audio quality factor
|
|
107
|
-
* @return FfmpegCommand
|
|
108
|
-
*/
|
|
109
|
-
proto.withAudioQuality =
|
|
110
|
-
proto.audioQuality = function(quality) {
|
|
111
|
-
this._currentOutput.audio('-aq', quality);
|
|
112
|
-
return this;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Specify custom audio filter(s)
|
|
118
|
-
*
|
|
119
|
-
* Can be called both with one or many filters, or a filter array.
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* command.audioFilters('filter1');
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* command.audioFilters('filter1', 'filter2=param1=value1:param2=value2');
|
|
126
|
-
*
|
|
127
|
-
* @example
|
|
128
|
-
* command.audioFilters(['filter1', 'filter2']);
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* command.audioFilters([
|
|
132
|
-
* {
|
|
133
|
-
* filter: 'filter1'
|
|
134
|
-
* },
|
|
135
|
-
* {
|
|
136
|
-
* filter: 'filter2',
|
|
137
|
-
* options: 'param=value:param=value'
|
|
138
|
-
* }
|
|
139
|
-
* ]);
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* command.audioFilters(
|
|
143
|
-
* {
|
|
144
|
-
* filter: 'filter1',
|
|
145
|
-
* options: ['value1', 'value2']
|
|
146
|
-
* },
|
|
147
|
-
* {
|
|
148
|
-
* filter: 'filter2',
|
|
149
|
-
* options: { param1: 'value1', param2: 'value2' }
|
|
150
|
-
* }
|
|
151
|
-
* );
|
|
152
|
-
*
|
|
153
|
-
* @method FfmpegCommand#audioFilters
|
|
154
|
-
* @aliases withAudioFilter,withAudioFilters,audioFilter
|
|
155
|
-
* @category Audio
|
|
156
|
-
*
|
|
157
|
-
* @param {...String|String[]|Object[]} filters audio filter strings, string array or
|
|
158
|
-
* filter specification array, each with the following properties:
|
|
159
|
-
* @param {String} filters.filter filter name
|
|
160
|
-
* @param {String|String[]|Object} [filters.options] filter option string, array, or object
|
|
161
|
-
* @return FfmpegCommand
|
|
162
|
-
*/
|
|
163
|
-
proto.withAudioFilter =
|
|
164
|
-
proto.withAudioFilters =
|
|
165
|
-
proto.audioFilter =
|
|
166
|
-
proto.audioFilters = function(filters) {
|
|
167
|
-
if (arguments.length > 1) {
|
|
168
|
-
filters = [].slice.call(arguments);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (!Array.isArray(filters)) {
|
|
172
|
-
filters = [filters];
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
this._currentOutput.audioFilters(utils.makeFilterStrings(filters));
|
|
176
|
-
return this;
|
|
177
|
-
};
|
|
178
|
-
};
|