Category: FFmpeg

  • FFMpeg in Docker

    tar -cf cuda1.tar /usr/local/cuda
    
    sudo docker rm -f encoder
    
    sudo docker run -itd --name encoder --restart always --gpus all --add-host rcc.work:192.168.126.37 ubuntu
    
    sudo docker cp /usr/local/cuda/. encoder:/usr/local/cuda
    sudo docker cp /usr/lib/x86_64-linux-gnu/. encoder:/usr/lib/x86_64-linux-gnu
    sudo docker cp /etc/alternatives/. encoder:/etc/alternatives
    
    echo 'Acquire::http::Proxy "http://rcc.work:3142";' > /etc/apt/apt.conf
    rm -rf /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
    apt-get -y update && apt-get -y upgrade
    apt-get -y install apt-utils
    apt-get -y install dialog 
    git build-essential
    
    
    #https://docs.nvidia.com/video-technologies/video-codec-sdk/12.0/ffmpeg-with-nvidia-gpu/index.html
    cd ~
    git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
    cd nv-codec-headers && make install && cd ~
    git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
    cd ffmpeg
    
    apt-get -y install yasm pkg-config nasm libx264-dev libx265-dev libnuma-dev libpostproc-dev libass-dev fontconfig libavcodec-dev libavformat-dev software-properties-common libfaac-dev
    
    echo '/usr/local/lib' >> /etc/ld.so.conf 
    echo 'cd /root/' >> ~/.bashrc
    echo 'CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
    echo 'PATH=${CUDA_HOME}/bin:${PATH}' >> ~/.bashrc
    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc
    
    ./configure --enable-nonfree --enable-cuda --enable-cuvid --enable-nvenc --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared --enable-gpl --enable-libx264 --enable-libx265 --enable-libass --enable-fontconfig --enable-libfribidi --enable-libfontconfig --enable-libfdk-aac
    
    make -j 6 && make install
    
    
    
    mkdir /usr/local/cuda
    mkdir 
    
    #!/bin/bash
    INPUT_MOV='gun.mp4'
    INPUT_SUB='English.srt'
    INPUT_SUB='gun.srt'
    OUTPUT_MOV='gun2.mkv'
    CPU='libx264'
    GPU='hevc_nvenc'
    
    ffmpeg \
            -hwaccel_output_format cuda \
            -i ${INPUT_MOV} -c:v ${GPU} \
            -vf "subtitles=${INPUT_SUB}:force_style='FontName=Malgun Gothic,FontSize=24',scale=hd720" \
            -c:a aac -b:a 192k -ac 2 -y -f matroska \
            ${OUTPUT_MOV}
    
    sshpass -p 1 sftp -P 20536 byun1114@office.work << EOF
    cd TMP
    put ${OUTPUT_MOV}
    EOF
    
    
  • 영화 감상용으로 변환하기

    내가 영화를 주로 보는 환경은 출퇴근 시간이다. 집중력이 높을 때가 아니다. 그렇게 집중해서 볼 수 있는 영화도 아니다. 그래서 20분 간격으로 끊어서 보기로 했다. 자막도 hard 하게 직접 영상에 입혀서 보기로 했다.

    자막은 SRT 포맷으로 변환해 준다. H.265를 굳이 사용해야 할 이유가 없어 H.264를 선택했다.

    #!/bin/bash
    cd INPUT
    INPUT_MOV=`ls *.m*`
    INPUT_SUB=`ls *.srt`
    CPU='libx264'
    #GPU='hevc_nvenc'
    GPU='h264_nvenc'
    echo MOVIE: ${INPUT_MOV}
    echo SUBTITLE: ${INPUT_SUB}
    echo ""
    OUTPUT_MOV=${INPUT_MOV/.mp4/}
    echo OUTPUT: ${OUTPUT_MOV}
    
    cd /root
    
    ffmpeg \
    -hwaccel_output_format cuda \
    -i INPUT/${INPUT_MOV} -c:v ${GPU} \
    -vf "subtitles=INPUT/${INPUT_SUB}:charenc=UTF-8:force_style='FontName=Roboto,FontSize=20',scale=-1:720" \
    -c:a aac -b:a 128k -ac 2 -y -f matroska \
    -f segment \
    -reset_timestamps 1 \
    -segment_time 1200 \
    OUTPUT/${OUTPUT_MOV}_%1d.mp4
  • 컴파일해서 실행하기

    도커에서 GPU를 이용하여 동영상 변환을 하려고 할 경우이다.

    내 환경에 맞게 도커 컨테이너를 만든다.

    sudo docker run -it --name encoder --restart always --gpus all --add-host rcc.work:192.168.126.37 debian

    기본 설치를 한다.

    echo 'Acquire::http::Proxy "http://rcc.work:3142";' > /etc/apt/apt.conf
    rm -rf /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
    apt-get -y update && apt-get -y upgrade
    apt-get -y install dialog git build-essential

    컴파일 하기 전 필요한 다른 패키지를 설치한다. 더 줄일려고 했는데 일단 여기에서 멈추었다.

    apt-get -y install yasm pkg-config nasm libx264-dev libx265-dev libnuma-dev  libpostproc-dev libass-dev fontconfig libavcodec-dev libavformat-dev software-properties-common

    git에서 필요한 것들을 다운 받는다.

    #https://docs.nvidia.com/video-technologies/video-codec-sdk/12.0/ffmpeg-with-nvidia-gpu/index.html
    cd ~
    git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
    cd nv-codec-headers && make install && cd ~
    git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
    cd ffmpeg

    GPU를 이용하는 과정에서 파일이 없다는 오류가 생긴다. 필요한 파일이 포함된 폴더를 전체를 복사해 준다. 이렇게 해도 큰 문제는 없는 것 같다.

    sudo docker cp /usr/local/cuda/. encoder:/usr/local/cuda
    sudo docker cp /usr/lib/x86_64-linux-gnu/. encoder:/usr/lib/x86_64-linux-gnu
    sudo docker cp /etc/alternatives/. encoder:/etc/alternatives

    필요한 설치 환경에 다음을 추가하여 준다.

    echo 'CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
    echo 'PATH=${CUDA_HOME}/bin:${PATH}' >> ~/.bashrc
    
    CUDA_HOME=/usr/local/cuda
    export PATH=${CUDA_HOME}/bin:${PATH}
    
    echo '/usr/local/lib' >> /etc/ld.so.conf
    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc

    컴파일 하고 설치한다.

    ./configure --enable-nonfree --enable-cuda --enable-cuvid --enable-nvenc --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared --enable-gpl --enable-libx264 --enable-libx265 --enable-libass --enable-fontconfig
    
    make -j 6
    
    make install
  • 동영상 가로, 세로 크기

    다른 방법이 있을지도 모르지만, 일단 당장 써먹을 수 있는 방법.

    ffprobe The_Grapes_Of_Wrath_1940.mp4 -show_entries stream=width,height -v error -select_streams v:0 -of default=nw=1  | grep width | sed 's/width=//g'