前提・実現したいこと
Next.jsのAPI Routesでffmpegを使用しています。
現在ローカルマシンに保存してあるffmpeg.exeまでのパスを下記のようにprocess.env.PATH
に設定すれば、ffmpegが使えます。
typescript
1const path = "C:/User/.../ffmpeg.exeがあるフォルダ"; 2process.env.PATH = path; 3 4execSync(`ffmpeg -i input.mp4 -c copy public/output.mp4`);
プロジェクトのルートにあるpublicフォルダにffmpegを格納し、パスをpublicフォルダに設定して、ローカルマシンに保存してあるffmepgを使わずに、ffmpegを実行できるようにしたいです。
現状、パスにpublicフォルダに設定しても次項のエラーがターミナルに表示されます。
発生している問題・エラーメッセージ
process.env.PATHに"/public"を設定した場合
'ffmpeg' �́A�Ք�R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B Error: Command failed: ffmpeg -i input.mp4 -c copy public/output.mp4 'ffmpeg' �́A�����R�}���h�܂��͊O���R�}���h�A ����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B at checkExecSyncError (child_process.js:790:11) at execSync (child_process.js:863:15) at downloadVideo (webpack-internal:///./pages/api/convert-video.ts:23:81) at Object.apiResolver (C:\Users\user\project\node_modules\next\dist\server\api-utils.js:102:15) at runMicrotasks (<anonymous>) at processTicksAndRejections (internal/process/task_queues.js:95:5) at async DevServer.handleApiRequest (C:\Users\user\project\node_modules\next\dist\server\next-server.js:1064:9) at async Object.fn (C:\Users\user\project\node_modules\next\dist\server\next-server.js:951:37) at async Router.execute (C:\Users\user\project\node_modules\next\dist\server\router.js:222:32) at async DevServer.run (C:\Users\user\project\node_modules\next\dist\server\next-server.js:1135:29) { status: 1, signal: null, output: [ null, <Buffer >, <Buffer 27 66 66 6d 70 65 67 27 20 82 cd 81 41 93 e0 95 94 83 52 83 7d 83 93 83 68 82 dc 82 bd 82 cd 8a 4f 95 94 83 52 83 7d 83 93 83 68 81 41 0d 0a 91 80 8d ... 66 more bytes> ], pid: 159304, stdout: <Buffer >, stderr: <Buffer 27 66 66 6d 70 65 67 27 20 82 cd 81 41 93 e0 95 94 83 52 83 7d 83 93 83 68 82 dc 82 bd 82 cd 8a 4f 95 94 83 52 83 7d 83 93 83 68 81 41 0d 0a 91 80 8d ... 66 more bytes> }
該当のソースコード
typescript
1import type { NextApiRequest, NextApiResponse } from "next"; 2import { downloadVideoRes } from "lib/types"; 3import { execSync } from "child_process"; 4 5const path = "/public"; 6 7const convertVideo = async ( 8 req: NextApiRequest, 9 res: NextApiResponse<downloadVideoRes> 10) => { 11 try { 12 process.env.PATH = path; 13 execSync(`ffmpeg -i input.mp4 -c copy public/output.mp4`); 14 res.status(200).end(); 15 } catch (e: any) { 16 console.log(e); 17 res.status(500).send({ err: e }); 18 } 19}; 20 21export default convertVideo;
ディレクトリ
. ├── pages │ └── api │ └── convert-video.ts └── public ├── ffmpeg └── ffmpeg.exe
publicフォルダのffmpeg
は、Next.jsのAPI RoutesがAWSのLambdaで実行されるという情報を目にしたことがあったので、↓のページを参考にしてダウンロードしたffmpegです。
AWS Lambda(Node.js) + ffmpeg でエンコード
ffmpegのLinux Static Builds
のffmpeg-git-amd64-static.tar.xz
に入っていたffmpegです。
ただし、ローカルマシンに保存してあるのはffmpeg.exeであり、これにパスを通すとAPI Routesでffmpegが実行できるので、現状publicのffmpegは意味を成していない可能性があります。
補足情報(FW/ツールのバージョンなど)
- OS Windows10
- Next.js 12.0.7
あなたの回答
tips
プレビュー