const { FFmpeg } = FFmpegWASM; const genName = (name) => `[ffmpeg][${FFMPEG_TYPE}] ${name}`; const createFFmpeg = async () => { const ffmpeg = new FFmpeg(); await ffmpeg.load({ coreURL: CORE_URL, thread: FFMPEG_TYPE === "mt", }); return ffmpeg; }; describe(genName("new FFmpeg()"), () => { it("should be OK", () => { expect(new FFmpeg()).to.be.ok; }); }); describe(genName("FFmpeg.load()"), function () { // it("should work without any args", async () => { // const ffmpeg = new FFmpeg(); // await ffmpeg.load(); // expect(ffmpeg).to.be.ok; // }); it("should work when blob is false", async function () { // FIXME: failed to load ffmpeg-core.worker.js when blob is false. if (FFMPEG_TYPE === "mt") this.skip(); const ffmpeg = new FFmpeg(); await ffmpeg.load({ coreURL: CORE_URL, blob: false, }); expect(ffmpeg).to.be.ok; ffmpeg.terminate(); }); it("should receive download progress events", async () => { const ffmpeg = new FFmpeg(); let done = false; ffmpeg.on(FFmpeg.DOWNLOAD, ({ done: _done }) => { done = _done; }); await ffmpeg.load({ coreURL: CORE_URL, thread: FFMPEG_TYPE === "mt", }); expect(done).to.be.true; ffmpeg.terminate(); }); }); describe( genName( "FFmpeg directory APIs (createDir(), listDir(), deleteDir(), rename())" ), function () { let ffmpeg; before(async () => { ffmpeg = await createFFmpeg(); }); after(() => { ffmpeg.terminate(); }); it("should list root dir", async () => { const files = await ffmpeg.listDir("/"); expect(files).to.have.lengthOf(6); }); it("should create a dir", async () => { await ffmpeg.createDir("/dir1"); const files = await ffmpeg.listDir("/"); expect(files).to.include("dir1"); }); it("should delete a dir", async () => { await ffmpeg.createDir("/dir2"); await ffmpeg.deleteDir("/dir2"); const files = await ffmpeg.listDir("/"); expect(files).to.not.include("dir2"); }); it("should rename a dir", async () => { await ffmpeg.createDir("/dir3"); await ffmpeg.rename("/dir3", "/dir4"); const files = await ffmpeg.listDir("/"); expect(files).to.not.include("dir3"); expect(files).to.include("dir4"); }); } ); describe( genName( "FFmpeg files APIs (readFile(), writeFile(), deleteFile(), rename())" ), function () { let ffmpeg; before(async () => { ffmpeg = await createFFmpeg(); }); after(() => { ffmpeg.terminate(); }); it("should write/read a text file", async () => { const text = "foo"; await ffmpeg.writeFile("/file1", text); const data = await ffmpeg.readFile("/file1", "utf8"); const files = await ffmpeg.listDir("/"); expect(files).to.include("file1"); expect(data).to.equal(text); }); it("should write a binary file", async () => { const bin = [1, 2, 3]; await ffmpeg.writeFile("/file2", Uint8Array.from(bin)); const data = await ffmpeg.readFile("/file2"); const files = await ffmpeg.listDir("/"); expect(files).to.include("file2"); expect(data).to.deep.equal(Uint8Array.from(bin)); }); } ); describe(genName("FFmpeg.exec()"), function () { let ffmpeg; before(async () => { ffmpeg = await createFFmpeg(); await ffmpeg.writeFile("video.mp4", b64ToUint8Array(VIDEO_1S_MP4)); }); after(() => { ffmpeg.terminate(); }); it("should output help with exit code 0", async () => { let m; const listener = ({ message }) => { m = message; }; ffmpeg.on(FFmpeg.LOG, listener); const ret = await ffmpeg.exec(["-h"]); expect(ret).to.equal(0); expect(m).to.be.a("string"); ffmpeg.removeListener(FFmpeg.LOG, listener); }); it("should transcode mp4 to avi", async () => { let p; const listener = ({ progress }) => { p = progress; }; ffmpeg.on(FFmpeg.PROGRESS, listener); const ret = await ffmpeg.exec(["-i", "video.mp4", "video.avi"]); expect(ret).to.equal(0); expect(p).to.equal(1); ffmpeg.removeListener(FFmpeg.PROGRESS, listener); }); it("should stop if timeout", async () => { const ret = await ffmpeg.exec(["-i", "video.mp4", "video.avi"], 1); expect(ret).to.equal(1); }); });