美文网首页大数据 爬虫Python AI SqlPython小哥哥
Python生成抖音字符视频,技术流!

Python生成抖音字符视频,技术流!

作者: 14e61d025165 | 来源:发表于2019-04-29 15:24 被阅读2次

    抖音字符视频在去年火过一段时间。

    反正我是始终忘不了那段极乐净土的音乐...

    这一次自己也来实现一波,做一个字符视频出来。

    主要用到的库有cv2,pillow库。

    原视频,直接抖音下载的,妥妥的水印。

    <tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1556522599525" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image

    <input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>

    Python学习交流群:1004391443,有大牛答疑,有资源共享!有想学习python编程的,想提升自己能力的,欢迎加入讨论学习。

    / 01 / 视频转图片

    在Pycharm上直接安装cv2库是成功不了的,具体什么原因我也不清楚。

    经过我的实践,发现只需在Pycharm的虚拟环境下。

    运行下面这个命令,即可成功安装cv2这个库。

    <pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">pip3 install opencv-python
    </pre>

    不过还是会出现下载速度过慢,导致超时。

    如果实在不行就可以去官网,下个.whl格式来安装。

    视频转图片代码如下。

    <pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">import cv2
    import os

    在当前目录下新建文件夹

    folder_path = "img_bear/"
    os.makedirs(folder_path)

    进行视频的载入

    vc = cv2.VideoCapture('bear.mp4')
    c = 0

    判断载入的视频是否可以打开

    ret = vc.isOpened()

    循环读取视频帧

    while ret:
    c = c + 1
    # 进行单张图片的读取,ret的值为True或者Flase,frame表示读入的图片
    ret, frame = vc.read()
    if ret:
    # 存储为图像
    cv2.imwrite('img_bear/'+str(c) + '.jpg', frame)
    # 输出图像名称
    print('img_bear/'+str(c) + '.jpg')
    # 在一个给定的时间内(单位ms)等待用户按键触发,1ms
    cv2.waitKey(1)
    else:
    break

    视频释放

    vc.release()
    </pre>

    最后成功生成了369张图片。

    呆萌呆萌的××熊,我是不知道什么品种的熊...

    / 02 / 图片转字符

    普通图片转字符图片主要使用了pillow库。

    对图片做灰度处理,然后根据图片像素点的灰度值,添加对应的字符。

    具体代码如下。

    <pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">from PIL import Image, ImageDraw, ImageFont
    import numpy as np
    import os

    创建字符图片文件夹

    folder_path = "bear/"
    os.makedirs(folder_path)
    for i in range(1, 1000):
    filename = 'img_bear/' + str(i) + '.jpg'
    # 字符列表
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~ <>i!lI;:,"^`'. ")
    # 判断图片是否存在
    if os.path.exists(filename):
    # 将图片转化为灰度图像,并重设大小
    img_array = np.array(Image.open(filename).resize((70, 70), Image.ANTIALIAS).convert('L'))
    # 创建新的图片对象
    img = Image.new('L', (560, 560), 255)
    draw_object = ImageDraw.Draw(img)
    # 设置字体
    font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
    # 根据灰度值添加对应的字符
    for j in range(70):
    for k in range(70):
    x, y = k * 8, j * 8
    index = int(img_array[j][k] / 4)
    draw_object.text((x, y), ascii_char[index], font=font, fill=0)
    name = 'bear/' + str(i) + '.jpg'
    print(name)
    # 保存字符图片
    img.save(name, 'JPEG')
    </pre>

    最后成功生成了字符图片。

    <tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1556522599542" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image

    <input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>

    和上面的原图一样,也是369张。

    / 03 / 字符转视频

    接下来使用cv2库,将字符图片转化为视频。

    具体代码如下。

    <pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">import cv2
    import os

    设置视频编码器,这里使用使用MJPG编码器

    fourcc = cv2.VideoWriter_fourcc(*'MJPG')

    输出视频参数设置,包含视频文件名、编码器、帧率、视频宽高(此处参数需和字符图片大小一致)

    videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (560, 560))
    for i in range(1, 1000):
    filename = 'bear/'+str(i)+'.jpg'
    # 判断图片是否存在
    if os.path.exists(filename):
    img = cv2.imread(filename=filename)
    # 在一个给定的时间内(单位ms)等待用户按键触发,100ms
    cv2.waitKey(100)
    # 将图片写入视频中
    videoWriter.write(img)
    print(str(i) + '.jpg' + ' done!')

    视频释放

    videoWriter.release()
    </pre>

    最后成功生成字符视频,这里放个图

    <tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1556522599547" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image

    <input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>

    相关文章

      网友评论

        本文标题:Python生成抖音字符视频,技术流!

        本文链接:https://www.haomeiwen.com/subject/fziynqtx.html