Home🏡

i, r0b0t .mp4

aHR0cHM6Ly90Lmx5L3F1eU4= is hex?

Produzir um vídeo;

Decidi usar o Python nesse passo pelo mesmo motivo da geração de arquivos MP3. Nesse código é usada a biblioteca do python moviepy, ela utiliza um software bem conhecido chamado FFmpeg, de forma resumida esse software permite que sejam feitas diver ações com arquivos de audio e vídeo em diversos formatos.

O código le um arquivo MP4 da pasta /backgrounds, depois acessa a pasta /output e utilizando os recursos da moviepy, ele links os prints do post e dos comentários com seus respectivos arquivos de audio e configurando a duração das imagens de acordo com a duração dos audios.

Depois é feita uma sobreposição no arquivo MP4 com as imagens e também com o audio, removendo assim o audio original do MP4. No final é gerado na pasta /render um novo arquivo de vídeo, este sendo o final para publicar no Tiktok.

from moviepy.editor import *
import random, os
import argparse

parser = argparse.ArgumentParser(description="Just an example", formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument("-n", "--name", help="file name")

VIDEO_HEIGHT = 1920
VIDEO_WIDTH = 1080

def generate_video(name):
    backgroundFile = "backgrounds/" + random.choice(os.listdir("backgrounds"))
    videoDuration = 0

    images = []
    audios = []

    filesToHandle = ['post']
    for i in range(6):
        if os.path.exists(f'output/{i}.mp3'):
            filesToHandle.append(str(i))

    for file in filesToHandle:
        audioFile = AudioFileClip(f"output/{file}.mp3")
        imageFile = ImageClip(f"output/{file}.png", duration=audioFile.duration).fx(vfx.resize,width=VIDEO_WIDTH*0.9).set_position(("center","center"))

        audios.append(audioFile)
        images.append(imageFile)
        videoDuration += audioFile.duration

        if videoDuration > 90:
            break

    concatenatedImages = concatenate_videoclips(images).set_position(("center", "center"))
    concatenatedAudios = concatenate_audioclips(audios)

    # 3 minute limit
    if concatenatedAudios.duration > 60*2.9:
        return False

    background = VideoFileClip(backgroundFile).fx(vfx.resize, height=VIDEO_HEIGHT).fx(vfx.loop, duration=concatenatedImages.duration).set_position(("center","center"))

    fullVideo = CompositeVideoClip([background, concatenatedImages], (VIDEO_HEIGHT, VIDEO_WIDTH))
    fullVideo.audio = concatenatedAudios
    fullVideo.duration = concatenatedAudios.duration

    fullVideo.write_videofile(f'render/{name}.mp4', threads=8, fps=24)

    return True

def main():
    args = parser.parse_args()
    config = vars(args)

    videoWasCreated = generate_video(config["name"])

    if (videoWasCreated):
        print('VIDEO_WAS_CREATED')
    else:
        print('VIDEO_WASNT_CREATED')

main()

A geração de vídeo final pode demorar um pouco, eu não entendo muito bem de renderização mas é algo que nós sentimos em qualquer software que renderiza audio, vídeos e também 2D/3D.

Clique para ver o vídeo gerado: Vídeo gerado

Post Principal