How to Use FFmpeg with Node.js and Docker
Tags: node
Published: 2022-07-09 08:29:35

_To read more articles like this, [visit my blog](https://www.mdfaisal.com/blog)_

### How to work with Audio and Video files in Node.js easily
Today we will learn how we can use FFmpeg with Node.js inside a Docker container.

#### Background
Usually, when we are running a Node.js application, all of the required parts for that application are inside the npm packages which go inside the **node_modules** folder.

However, for some specific use cases, we need to access the OS-level applications which makes it a little bit complicated.
One good example of this is FFmpeg which is described in their documentation as:
<https://ffmpeg.org/>

**A complete, cross-platform solution to record, convert and stream audio and video.**

Long story short, if you need to work with audio and video conversion or modification, you will need this.
#### The problem
The problem is FFmpeg is not any npm module that you can just install and use. There are some libraries on top of the **FFmpeg** like ``ffcreator`` and ``fluent-ffmpeg`` which create an abstraction on top of **FFmpeg** but you will still need FFmpeg installed on the OS level.

So, to resolve the problem, one easy solution is to install FFmpeg on the server where you are running your application.

But in modern days, we hardly directly use the hardware. Because whenever you need a new server, you will need to install it again.

Which is repetitive and boring right?
#### The Solution
The easier approach is to bundle your application with FFmpeg installed inside a Docker image which makes it really easy to distribute and your application is now sharable and reproducible!

But how exactly do you do that? It's really simple. On top of your base image, you will run the commands for installing FFmpeg and that’s it!

Below is a working Dockerfile that does the trick.
```
FROM node:16-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

## following 3 lines are for installing ffmepg
RUN apk update
RUN apk add
RUN apk add ffmpeg

COPY . .

EXPOSE 4000

RUN npm run build

CMD [ "node", "dist/src/index.js" ]
```
So, the 3 lines in the middle install the FFmpeg inside your Node.js Alpine base image.

```
RUN apk update
RUN apk add
RUN apk add ffmpeg
```
Note: We are using ``apk add`` because at the top, we chose the ``node:16-alpineversion`` of node (which is smaller in size).


If you are using a proper Node.js image like ``node:16``, then the commands to install FFmpeg will be like the following:
```
RUN apt update
RUN apt install ffmpeg
```
That should do the trick.

#### Alternative
The above approach works for Node.js and Docker images. But if you want to deploy your Node.js application using AWS Lambda or Google Cloud Functions, then it will create some problems.

To avoid that, there is another approach. We can use an npm package called ``ffmpeg-static``.

Inside your project:

```
npm install --save ffmpeg-static
```
It will download the binary files and store them inside the ``node_modules`` folder. From your application, you have to point the path to the binary files inside the ``node_modules`` folder.

You can get the path in the following manner:

```
var pathToFfmpeg = require('ffmpeg-static');
console.log(pathToFfmpeg);
```
Then you can export it as a path.

```
ENV PATH="/your/path/to/node_modules/ffmpeg-
static/bin/linux/x64:${PATH}"
```
That’s how you can achieve that. This particular thread is useful.
<https://stackoverflow.com/questions/50693091/ffmpeg-install-within-existing-node-js-docker-image>

That’s it for today. Have a great day!

Resources:
<https://stackoverflow.com/questions/50693091/ffmpeg-install-within-existing-node-js-docker-image>