Skip to content

Procedimento para criar os vídeos em baixa resolução

Nosso objetivo aqui é transformar vídeos em alta resolução e qualidade, em vídeos de baixa resolução e baixa qualidade, com as mesmas restrições impostas pela simulação de transmissão hidro acústica.

Passos para realizar a transformação

1. Renomear frames

Nossos dados de entrada eram frames no formato PNG sem uma nomenclatura padronizada, então para transformá-los em vídeos precisamos antes renomeá-los de acordo. O script python abaixo foi utilizado para isso.

# rename-imgs.py

"""Rename images of a given folder to sequential zfilled numbers"""
import os
import sys


def rename_imgs(path):
    """Rename images of given path"""
    im_list = os.listdir(path)
    ext = im_list[0].split("/")[-1].split(".")[1]
    im_list = list(map(lambda x: x.split("/")[-1].split(".")[0], im_list))
    im_len = len(im_list)
    for i, im in enumerate(im_list, start=1):
        os.system('clear')
        print(f"Renaming {i} of {im_len}")
        curr_im = f"{path}/{im}.{ext}"
        new_im = f"{path}/im{str(i).zfill(4)}.{ext}"
        os.rename(curr_im, new_im)


if __name__ == "__main__":
    rename_imgs(sys.argv[1])

Para utilizá-lo basta chamar python rename-imgs.py /caminho/das/imagens. Com esse script, imagens foram de ZdhsXc.png, Sdxgkm.png... para im0001.png, im0002.png.

2. Juntar em vídeo

Agora que temos os frames em sequencia, podemos juntá-los em um vídeo, para isso utilizamos uma imagem singularity com FFMPEG, e agendamos um novo "job" para o slurm do cluster, usando o comando sbatch make_vid.srm. O script abaixo realiza a criação dos vídeos.

# make_vid.srm

#!/bin/sh
#SBATCH --nodes=1
#SBATCH --partition=gpu
#SBATCH --ntasks=1
#SBATCH --mem=7500
#SBATCH --gres=gpu:1
#SBATCH --oversubscribe
#SBATCH --ntasks-per-node=1
#SBATCH -J make_vid.srm

singularity run \
        -B /share_zeta/UnderTheSea/lucasmc/data/sr-train/originals:/originals \
        /share_zeta/UnderTheSea/singularities/ffmpeg.sif \
        -f image2 -framerate 1 \
        -i /originals/plem_e_plet/im%04d.png \
        -f rawvideo -pix_fmt yuv420p \
        -s 640x320 /originals/plem_e_plet.yuv

-B mapeia a pasta de origem para a pasta de destino no formato origem:destino. A pasta originals contem as demais pastas com os frames anteriormente renomeados. A próxima linha informa qual a imagem singularity que vamos utilizar, nesse caso a ffmpeg.sif. Os demais parâmetros são configurações do FFMPEG, para um vídeo de 1 frame por segundo, tendo como entrada (-i) a pasta /originals/plem_e_plet, onde os frames estão ordenados seguindo o padrão im%04d, isso é: im0001, im0002, etc.

3. Transformar vídeo para baixa resolução/qualidade

Agora que temos o vídeo dos frames em alta qualidade e resolução, vamos usar o FFMPEG para convertê-lo em baixa resolução e qualidade, usando o H.264 e as configurações adequadas.

# stream_vid.srm

#!/bin/sh
#SBATCH --nodes=1
#SBATCH --partition=gpu
#SBATCH --ntasks=1
#SBATCH --mem=7500
#SBATCH --gres=gpu:1
#SBATCH --oversubscribe
#SBATCH --ntasks-per-node=1
#SBATCH -J stream_vid.srm

singularity run \
        -B /share_zeta/UnderTheSea/lucasmc/data/sr-train/originals:/originals \
        /share_zeta/UnderTheSea/singularities/ffmpeg.sif \
        -pix_fmt yuv420p \
        -video_size 640x320 \
        -i /originals/anm.yuv \
        -preset ultrafast \
        -vcodec libx264 \
        -tune zerolatency \
        -r 1 \
        -maxrate 80k \
        -bufsize 320k \
        /originals/anm-stream.yuv

O processo é parecido com o script acima, porém aqui estamos dando como entrada para o FFMPEG o vídeo /originals/anm.yuv, e esperamos a saída em /originals/anm-stream.yuv. Precisamos passar o video_size pois o FFMPEG não tem como inferir a partir do formato yuv, especificamos o H.264 como a biblioteca libx264, no parâmetro vcodec, e restringimos a qualidade nas demais linhas.