Vamos usar o Python para criar um script de geração de vídeo curto automatizado para obter uma produção de pipeline de vídeo popular!

prefácio

Alguns dias atrás, um fã me disse que recentemente vi que algumas contas de marketing de vídeo podem publicar centenas de vídeos curtos por dia na Internet. Parece que todos são gerados em lotes. Você pode usar o Python para fazer um vídeo curto automatizado roteiro de geração?

Hoje, vou levá-lo a usar o Python para criar um script de geração de vídeo automatizado para realizar a produção em lote de vídeos populares. Vamos dar uma olhada~

Pule diretamente para o final do artigo para obter os benefícios do código-fonte.

1. Design da função principal

Em primeiro lugar, assisti aos vídeos dessas contas de vídeo marketing na Internet, a maioria deles são carrosséis de vídeo com algumas fotos em torno de um tema e adicionam algumas músicas populares como música de fundo.

Conhecendo a ideia geral, podemos implementar os seguintes passos:

  • Rastreamento em lote de imagens por palavras-chave
  • Filtre as imagens rastreadas e redimensione-as em lotes
  • Síntese de vídeo a partir de imagens de tamanho uniforme
  • De acordo com a música selecionada, intercepte a música de fundo apropriada
  • Mesclar vídeo e música de fundo capturada

2. Etapas de implementação

1. Rastreamento de imagens

Claro, se você já tiver material de vídeo e quiser apenas adicionar um plano de fundo diretamente ao vídeo, pule para a etapa 4; se já tiver material de imagem que não precisa ser rastreado, pule para a etapa 2 .

Na primeira etapa, podemos realizar a pesquisa de imagens por palavra-chave de acordo com o tema de vídeo desejado e rastrear imagens em lotes. Por exemplo, tomamos a animação japonesa "Seu nome" como tema e rastreamos imagens relacionadas à animação inserindo palavras-chave. O código central é o seguinte:

def dowmloadimg(html, keyword, startNum):
    headers = {
    
    'user-agent': 'Mozilla/5.0'}  # 请求头
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 找到符合正则规则的网址
    num = len(pic_url)
    i = startNum
    subroot = root
    txtpath = subroot + '/download_img.txt'
    print('找到关键词:' + keyword + '的图片,开始下载图片...')
    for each in pic_url:
        a = '第' + str(i + 1) + '张图片,图片地址:' + str(each) + '\n'
        b = '正在下载' + a
        print(b)
        path = subroot + '/' + str(i + 1)
        try:
            if not os.path.exists(subroot):
                os.makedirs(subroot)
            if not os.path.exists(path):
                pic = requests.get(each, headers=headers, timeout=10)
                with open(path + '.jpg', 'wb') as f:
                    f.write(pic.content)
                    f.close()
                with open(txtpath, 'a') as f:
                    f.write(a)
                    f.close()
        except:
            traceback.print_exc()
            print('ERROR!!!当前图片无法下载!!!')
            continue
        i += 1
    return i
words = input("请输入关键字: ")
root = './' + words
if not os.path.exists(root):
    os.makedirs(root)

# 参数为需爬取的页数
for i in range(2):
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + words + "&pn=" + str(
        pageId) + "&gsm=?&ct=&ic=0&lm=-1&width=0&height=0"
    pageId += 20
    html = requests.get(url, headers=headers)
    lastNum = dowmloadimg(html.text, words, lastNum, )  # 执行一次获取60张图

Neste ponto, podemos rastrear as imagens de acordo com as palavras-chave e nomear as imagens de acordo com a ordem numérica , conforme mostrado na figura a seguir.

insira a descrição da imagem aqui

2. Imagens em formato e tamanho unificados

Na segunda etapa, precisamos unificar o tamanho e o formato das imagens obtidas para facilitar a síntese de vídeo posterior. Aqui, podemos filtrar manualmente algumas imagens que precisam ser redimensionadas com um tamanho uniforme, ou podemos unificar em lote o formato e o tamanho das imagens em toda a pasta que rastreamos. O tamanho da imagem pode ser definido através do código, aqui unificamos o tamanho de todas as imagens em 600*800. O código central é o seguinte:

# 将所有图像resize成600*800,并保存
def resize_image(image_name):
    # 获取输入文件夹中的所有文件
    files = os.listdir('./' + image_name)
    output_dir = './resize/'
    # 判断输出文件夹是否存在,不存在则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for file in files:
        if file[-4:] == ".jpg":
            img = Image.open('./' + image_name + '/' + file)
            # 将所有图片均转成RGB,防止图片格式异常
            img = img.convert('RGB')
            # resize图片大小设置成600*800
            img = img.resize((600, 800), Image.ANTIALIAS)
            img.save(os.path.join(output_dir, file))

insira a descrição da imagem aqui

3. Síntese de vídeo

Na terceira etapa, podemos combinar essas imagens de formato e tamanho uniformes para síntese de vídeo. Aqui, podemos combinar todas as imagens em uma pasta inteira, ou podemos selecionar manualmente as partes. Ao sintetizar, mesclamos as imagens de acordo com a ordem numérica de nomenclatura das imagens. O código principal é o seguinte:

def charts2video(img_path, video_path):
    """将给定目录下的图片转成视频
        img_path: 图片路径
        video_path: 输出视频的路径名称
    返回: 图片转成的视频
    """
    images = os.listdir(img_path)
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序  
    fps = 1.5  # 帧数
    fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
    im = Image.open(img_path + images[0])
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    for img_i in images:
        frame = cv2.imread(img_path + img_i)
        print('开始将 ' + img_i + ' 加入视频\n')
        video_writer.write(frame)  # 图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
    video_writer.release()

Aqui, se quisermos controlar o número de fotos reproduzidas por segundo no vídeo, podemos definir o número de quadros de acordo com quantas fotos são reproduzidas por segundo representadas por fps , para completar a síntese de vídeo das fotos.

4. Capture a música de fundo

A quarta etapa, antes que a música de fundo seja interceptada, primeiro precisamos confirmar a duração do vídeo , para que possamos interceptar a música de fundo oportuna. Assim, podemos obter a duração do vídeo primeiro e retornar a duração do vídeo em s. O código principal é o seguinte:

def get_video_time(filename):
  cap = cv2.VideoCapture(filename)
  if cap.isOpened():
    rate = cap.get(5)
    frame_num =cap.get(7)
    duration = frame_num/rate
    return duration
  return -1
t = get_video_duration('./你的名字.mp4')

Agora que a duração do vídeo é conhecida, vamos interceptar a música de fundo. O blogueiro escreveu um artigo sobre como fazer um player de música legal em Python . Se você estiver interessado, pode ir ver como foi feito. . O music player do blogger tem código aberto e pode ser obtido através da conta pública no final do artigo .

Hoje vamos usar este reprodutor de música caseiro para baixar as músicas que precisamos. Por exemplo, usamos "Displacement Time and Space" como música de fundo e podemos baixar a música localmente por meio deste player de música. Como mostrado abaixo.
insira a descrição da imagem aqui
Depois que a música é baixada, o próximo passo é interceptar a música. Aqui nós fornecemos dois métodos. Uma é interceptar a parte clímax da música e a outra é escolher o intervalo de interceptação da música por conta própria .

Captura automática do clímax da música:
os amigos que assistem frequentemente a vídeos curtos podem ver que a música de fundo de muitos vídeos curtos na Internet é o clímax da música. Então, o Python pode obter automaticamente o clímax de uma música? certamente! Python já levou em conta que pode interceptar automaticamente a parte clímax da música. Aqui precisamos usar o módulo pychorus . Especificamente, como conseguir isso, você pode verificar as informações na Internet para pesquisa e pesquisa.

Primeiro precisamos instalar o módulo pychorus

pip install pychorus

Concluída a instalação, importe o módulo pychorus e chame-o com uma linha de código. O parâmetro t passado aqui é a duração do vídeo que obtivemos acima, o que garante que a música de fundo e a duração do vídeo sejam as mesmas , que é conveniente para síntese de vídeo e música.

Ao mesmo tempo, também precisamos prestar atenção que a duração de uma música geralmente é de cerca de 3-4 minutos, portanto, é melhor que o t que passamos não exceda 1 minuto, caso contrário, a interceptação do clímax pode falhar . O código central é o seguinte:

from pychorus import find_and_output_chorus
chorus_start_sec = find_and_output_chorus("./错位时空 - 艾辰.mp3", "./错位时空_high.wav", t)

Conforme mostrado na figura abaixo, sabemos que a duração do vídeo é de 26s, e então interceptamos a música de fundo.O clímax adquirido automaticamente começa a partir de 2 minutos e 32 segundos e dura 26s. Neste ponto, podemos cortar o clímax da música atual para a fusão final de vídeo e música.
insira a descrição da imagem aqui

Personalize o intervalo da música de interceptação:

E se a duração do nosso vídeo for longa e não conseguirmos capturar o clímax da música? Podemos definir o intervalo de interceptação da música para obter a música de fundo. Vamos demonstrar que a música interceptada começa dos 20s ao final dos 90s. O código central é o seguinte:

# 截取背景音乐
audio_background = mpy.AudioFileClip('./错位时空 - 艾辰.mp3').subclip(20, 90)
audio_background.write_audiofile('bk.mp3')

insira a descrição da imagem aqui

5. Combinação de vídeo e música de fundo

Na quinta etapa, precisamos mesclar o vídeo com a música de fundo que acabamos de interceptar para sintetizar um novo vídeo. O código principal é o seguinte:

def add_music():
    # 读取代码视频
    my_clip = mpy.VideoFileClip('你的名字.mp4')
    # 截取背景音乐
    audio_background = mpy.AudioFileClip('错位时空_high.wav')
    # 视频中插入音频
    final_clip = my_clip.set_audio(audio_background)
    # 保存最终视频
    final_clip.write_videofile('result.mp4')

Neste ponto, todo o vídeo pode ser gerado automaticamente para realizar a produção de pipelines de vídeo populares! Vamos executá-lo juntos para ver como fica o vídeo gerado automaticamente.

O código-fonte e os dados foram enviados, preste atenção à conta pública no final do artigo e responda a [código-fonte do vídeo curto] para obter o código-fonte completo

Destaques anteriores do Python:

Acho que você gosta

Origin blog.csdn.net/hhladminhhl/article/details/120316789
Recomendado
Clasificación