¡Usemos Python para crear un script de generación de video corto automatizado para lograr una producción de canal de video popular!

prefacio

Hace unos días, un fan me dijo que recientemente vi que algunas cuentas de video marketing pueden publicar cientos de videos cortos al día en Internet. Parece que todos se generan en lotes. ¿Puedes usar Python para hacer un video corto automatizado? guión de generación?

Hoy, lo llevaré a usar Python para crear un script de generación de video automatizado para realizar la producción por lotes de videos populares. Echemos un vistazo ~

Pase directamente al final del artículo para obtener los beneficios del código fuente.

1. Diseño de funciones básicas

En primer lugar, vi los videos de esas cuentas de video marketing en Internet. La mayoría de ellos son carruseles de videos con algunas imágenes sobre un tema y agregan algunas canciones populares como música de fondo.

Conociendo la idea general, podemos implementar los siguientes pasos:

  • Rastreo de lotes de imágenes por palabras clave
  • Examine las imágenes rastreadas y cambie su tamaño en lotes
  • Síntesis de vídeo a partir de imágenes de tamaño uniforme
  • De acuerdo con la canción seleccionada, intercepta la música de fondo apropiada
  • Combinar video y música de fondo capturada

2. Pasos de implementación

1. Rastreo de imágenes

Por supuesto, si ya tiene material de video y solo desea agregar un fondo directamente al video, puede pasar al paso 4; si ya tiene material de imagen que no necesita rastrearse, puede pasar al paso 2 .

En el primer paso, podemos realizar una búsqueda de imágenes de palabras clave de acuerdo con el tema de video deseado y rastrear imágenes en lotes. Por ejemplo, tomamos la animación japonesa "Tu nombre" como tema y rastreamos imágenes relacionadas con la animación ingresando palabras clave. El código central es el siguiente:

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张图

En este punto, podemos rastrear las imágenes según las palabras clave y nombrar las imágenes según el orden numérico , como se muestra en la siguiente figura.

inserte la descripción de la imagen aquí

2. Imágenes en un formato y tamaño unificado

En el segundo paso, necesitamos unificar el tamaño y formato de las imágenes obtenidas para facilitar la posterior síntesis del vídeo. Aquí, podemos filtrar manualmente algunas imágenes que deben cambiarse de tamaño con un tamaño uniforme, o podemos unificar por lotes el formato y el tamaño de las imágenes en toda la carpeta que rastreamos. El tamaño de la imagen se puede establecer a través del código, aquí unificamos el tamaño de todas las imágenes en 600*800. El código central es el siguiente:

# 将所有图像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))

inserte la descripción de la imagen aquí

3. Síntesis de vídeo

En el tercer paso, podemos combinar estas imágenes de formato y tamaño uniforme para la síntesis de video. Aquí, podemos combinar todas las imágenes en la carpeta completa, o podemos seleccionar partes manualmente por nosotros mismos. Al sintetizar, fusionamos las imágenes de acuerdo con el orden de denominación numérica de las imágenes. El código central es el siguiente:

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()

Aquí, si queremos controlar la cantidad de imágenes reproducidas por segundo en el video, podemos establecer la cantidad de cuadros de acuerdo con la cantidad de imágenes reproducidas por segundo representadas por fps , para completar la síntesis de video de las imágenes.

4. Captura música de fondo

El cuarto paso, antes de que se intercepte la música de fondo, primero debemos confirmar la duración del video , para que podamos interceptar la música de fondo oportuna. Entonces, primero podemos obtener la duración del video y devolver la duración del video en s. El código central es el siguiente:

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')

Ahora que se sabe la duración del video, vamos a interceptar la música de fondo. El blogger escribió un artículo sobre cómo hacer un reproductor de música genial en Python . Si te interesa, puedes ir a ver cómo se hizo. . El reproductor de música de Blogger es de código abierto y se puede obtener a través de la cuenta pública al final del artículo .

Hoy usaremos este reproductor de música casero para descargar la música que necesitamos. Por ejemplo, usamos "Displacement Time and Space" como música de fondo, y podemos descargar la canción localmente a través de este reproductor de música. Como se muestra abajo.
inserte la descripción de la imagen aquí
Después de descargar la música, el siguiente paso es interceptar la música Aquí proporcionamos dos métodos. Una es interceptar la parte clímax de la canción y la otra es elegir el intervalo de intercepción de la canción usted mismo .

Captura automática del clímax de la canción:
los amigos que suelen ver videos cortos pueden ver que la música de fondo de muchos videos cortos en Internet es el clímax de la canción. Entonces, ¿puede Python obtener automáticamente el clímax de una canción? ¡ciertamente! Python ya ha tenido en cuenta que puede interceptar automáticamente la parte del clímax de la canción. Aquí necesitamos usar el módulo pychorus . Específicamente, cómo lograr esto, puede consultar la información en Internet para investigar e investigar.

Primero necesitamos instalar el módulo pychorus

pip install pychorus

Una vez completada la instalación, importe el módulo pychorus y llámelo con una línea de código. El parámetro t pasado aquí es la duración del video que obtuvimos arriba, lo que garantiza que la música de fondo y la duración del video sean las mismas . , que es conveniente para la síntesis de video y música.

Al mismo tiempo, también debemos prestar atención a que la duración de una canción es generalmente de unos 3-4 minutos, por lo que es mejor que el t que transmitamos no supere 1 minuto, de lo contrario, la intercepción del clímax puede fallar . El código central es el siguiente:

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

Como se muestra en la figura a continuación, sabemos que la duración del video es de 26 s, y luego interceptamos la música de fondo. El clímax adquirido automáticamente comienza a partir de 2 minutos y 32 segundos y dura 26 s. En este punto, podemos cortar el clímax de la canción actual para la fusión final de video y música.
inserte la descripción de la imagen aquí

Personaliza el intervalo de la canción de intercepción:

¿Qué pasa si la duración de nuestro video en sí es larga y no podemos capturar el clímax de la canción? Podemos definir el intervalo de intercepción de la canción para obtener la música de fondo. Demostremos que la canción interceptada comienza desde los 20 hasta el final de los 90. El código central es el siguiente:

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

inserte la descripción de la imagen aquí

5. Fusión de video y música de fondo

En el quinto paso, necesitamos fusionar el video con la música de fondo que acabamos de interceptar para sintetizar un nuevo video. El código central es el siguiente:

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')

¡En este punto, todo el video se puede generar automáticamente para realizar la producción de canales de video populares! Hagámoslo juntos para ver cómo se ve el video generado automáticamente.

El código fuente y los datos se cargaron, preste atención a la cuenta pública al final del artículo y responda a [código fuente del video corto] para obtener el código fuente completo

Lo más destacado del pasado de Python:

Supongo que te gusta

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