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.