skip to Main Content

I want to compress the video from project directory using ffmpeg in python

the video is saved from cv2.VideoCapture(rtsp_url)

Normally it run without problem in my local machine, but when I dockerize my app it seems docker container can’t recognize ffmpeg or I missed something.

def compress(name):
    with open(name) as f:
        output = name[0:-4] + "-f"+ ".mp4"
        input = name
        subprocess.run('ffmpeg -i ' + input + ' -vcodec libx264 ' + output)

video = cv2.VideoCapture(rtsp_url) # This is where the video comming from
fileName = saveToProjDir(video) # Save the video to project directory and return the name
compress(fileName) # Compress the video

It throws exception


Exception in thread Thread-8 (compress):
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.11/threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "/app/main.py", line 59, in compress
    subprocess.run('ffmpeg -i ' + input + ' -vcodec libx264 ' + output)
  File "/usr/local/lib/python3.11/subprocess.py", line 546, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/subprocess.py", line 1022, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.11/subprocess.py", line 1899, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg -i cam1_2022-11-15125845.avi -vcodec libx264 cam1_2022-11-15125845-f.mp4'

This is how I docker my python app.


FROM python:3.11.0

WORKDIR /app/

ENV VIRTUAL_ENV = /env
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

COPY requirements.txt .

RUN pip install -r requirements.txt
RUN apt-get -y update
RUN apt-get install ffmpeg libsm6 libxext6  -y

ADD main.py .
CMD ["python","/app/main.py"]

2

Answers


  1. If the python script mentioned in the beginning of the question is the content of main.py, then there are few issues with the implementation:

    • You cannot run docker with the python:3.11.0 as base image.
    • You need to mount the volume with the videos and just process them inside the container.
    Login or Signup to reply.
  2. To debug your problem my suggestion is to use your container interactively.

    Try running a new container like this:

    docker run -t -i <image-name-or-container-id> /bin/bash
    

    Or attach to your running container:

    docker exec -i -t <container-id> /bin/bash
    

    In this way you can play around, try to launch ffmpeg from different paths, install other dependencies and finally see what you are missing.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search