最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python視頻轉(zhuǎn)化字節(jié)問(wèn)題的完整實(shí)現(xiàn)

 更新時(shí)間:2022年05月11日 12:36:03   作者:白叔King  
在Python中可以將視頻和字節(jié)進(jìn)行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于python視頻轉(zhuǎn)化字節(jié)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

廢話(huà)不多說(shuō),直接開(kāi)干!

抖音字符視頻在今年火過(guò)一段時(shí)間。

反正我是始終忘不了那段劉耕宏老師本草綱目的音樂(lè)…

這一次自己也來(lái)實(shí)現(xiàn)一波,做一個(gè)字符視頻出來(lái)

百度好多都是顯示模塊,這個(gè)完整實(shí)現(xiàn)效果

步驟

將視頻轉(zhuǎn)化為一幀一幀的圖片

把圖片轉(zhuǎn)化為字符畫(huà)

按順序播放字符畫(huà)

1、準(zhǔn)備

安裝 Python-OpenCV 庫(kù)

安裝 Numpy 科學(xué)計(jì)算庫(kù)

用到模塊庫(kù)

import time

import cv2
import os
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os

然后新建python代碼文檔,在開(kāi)頭添加上下面的導(dǎo)入語(yǔ)句

2. 材料

材料來(lái)個(gè)視頻文件了,我這里用的是zimeng.mp4,下載下來(lái)和代碼放到同一目錄下

你也可以換成自己的,建議是學(xué)習(xí)時(shí)盡量選個(gè)短一點(diǎn)的視頻,十幾秒十秒就行了,方便調(diào)試用

此外,要選擇對(duì)比度高的視頻。否則的話(huà),就需要彩色字符才能有足夠好的表現(xiàn),有時(shí)間我試試。

3、按幀讀取視頻

現(xiàn)在繼續(xù)添加代碼,實(shí)現(xiàn)第一步:按幀讀取視頻。

下面這個(gè)函數(shù),接受視頻路徑和字符視頻的尺寸信息,返回一個(gè)img列表,其中的img是尺寸都為指定大小的灰度圖。

第一步截取圖片

def video_img(file='zimeng.mp4'):
    # 在當(dāng)前目錄下新建文件夾
    folder_path = "img_bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    # 進(jìn)行視頻的載入
    vc = cv2.VideoCapture(file)
    # 判斷載入的視頻是否可以打開(kāi)
    ret = vc.isOpened()
    # 循環(huán)讀取視頻幀
    num = 0
    while ret:
        num = num + 1
        # 進(jìn)行單張圖片的讀取,ret的值為T(mén)rue或者Flase,frame表示讀入的圖片
        ret, frame = vc.read()
        if ret:
            # 存儲(chǔ)為圖像
            cv2.imwrite('img_bear/' + str(num) + '.jpg', frame)
            # 輸出圖像名稱(chēng)
            print('img_bear/' + str(num) + '.jpg')
            # 在一個(gè)給定的時(shí)間內(nèi)(單位ms)等待用戶(hù)按鍵觸發(fā),1ms
            cv2.waitKey(1)
        else:
            break
    # 視頻釋放
    vc.release()
    time.sleep(0.5)
    video_image(num)

如果運(yùn)行沒(méi)報(bào)錯(cuò),就沒(méi)問(wèn)題

代碼里的注釋?xiě)?yīng)該寫(xiě)得很清晰了,繼續(xù)下一步

第二步對(duì)圖片做灰度處理

視頻轉(zhuǎn)換成了圖像,這一步便是把圖像轉(zhuǎn)換成字符畫(huà)

上面這個(gè)函數(shù),一個(gè)img對(duì)象為參數(shù),前往對(duì)應(yīng)的字符畫(huà)

def video_image(num=''):
    # 創(chuàng)建字符圖片文件夾
    folder_path = "bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    for i in range(1, num):
        filename = 'img_bear/' + str(i) + '.jpg'
        im = Image.open(filename)  # 返回一個(gè)Image對(duì)象
        width = im.size[0]
        heigth = im.size[1]
        print('寬:%d,高:%d' % (im.size[0], im.size[1]))
        # 字符列表
        ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~            <>i!lI;:,\"^`'. ")
        # 判斷圖片是否存在
        if os.path.exists(filename):
            # 將圖片轉(zhuǎn)化為灰度圖像,并重設(shè)大小
            img_array = np.array(Image.open(filename).resize((160, 160), Image.ANTIALIAS).convert('L'))
            # 創(chuàng)建新的圖片對(duì)象
            img = Image.new('L', (width, heigth), 255)
            draw_object = ImageDraw.Draw(img)
            # 設(shè)置字體
            font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
            # 根據(jù)灰度值添加對(duì)應(yīng)的字符
            for j in range(160):
                for k in range(160):
                    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')
    time.sleep(0.5)
    video(num)

第三步字符轉(zhuǎn)視頻

寫(xiě)了這么多代碼,如今終于要出效果了。如今就是最激動(dòng)人心的一步:播放字符畫(huà)了。

異樣的,我把它封裝成了一個(gè)函數(shù)。上面這個(gè)函數(shù)承受一個(gè)字符畫(huà)的列表并播放。

def video(num):
    filename = 'img_bear/' + str(1) + '.jpg'
    im = Image.open(filename)  # 返回一個(gè)Image對(duì)象
    width = im.size[0]
    heigth = im.size[1]
    # 設(shè)置視頻編碼器,這里使用使用MJPG編碼器
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    # 輸出視頻參數(shù)設(shè)置,包含視頻文件名、編碼器、幀率、視頻寬高(此處參數(shù)需和字符圖片大小一致)
    videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (width, heigth))

    for i in range(1, num):
        filename = 'bear/'+str(i)+'.jpg'
        # 判斷圖片是否存在
        if os.path.exists(filename):
            img = cv2.imread(filename=filename)
            # 在一個(gè)給定的時(shí)間內(nèi)(單位ms)等待用戶(hù)按鍵觸發(fā),100ms
            cv2.waitKey(100)
            # 將圖片寫(xiě)入視頻中
            videoWriter.write(img)
            print(str(i) + '.jpg' + ' done!')
    # 視頻釋放
    videoWriter.release()
    time.sleep(1)
    # 刪除圖片
    remove_img()
    remove_img_bear()

下面完整代碼

可能要等很久。我使用示例視頻大概需要 500 秒左右。

ctrl+f10執(zhí)行對(duì)應(yīng)的文件

完整代碼里面加了

執(zhí)行生成圖片,生成灰度圖片,最后通過(guò)灰度生成字節(jié)視頻刪除多余文件

說(shuō)了那太多廢話(huà)就是:最后還需刪除一些臨時(shí)的文件及文件夾。

import time

import cv2
import os
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os

# 第一步截取圖片
def video_img(file='zimeng.mp4'):
    # 在當(dāng)前目錄下新建文件夾
    folder_path = "img_bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    # 進(jìn)行視頻的載入
    vc = cv2.VideoCapture(file)
    # 判斷載入的視頻是否可以打開(kāi)
    ret = vc.isOpened()
    # 循環(huán)讀取視頻幀
    num = 0
    while ret:
        num = num + 1
        # 進(jìn)行單張圖片的讀取,ret的值為T(mén)rue或者Flase,frame表示讀入的圖片
        ret, frame = vc.read()
        if ret:
            # 存儲(chǔ)為圖像
            cv2.imwrite('img_bear/' + str(num) + '.jpg', frame)
            # 輸出圖像名稱(chēng)
            print('img_bear/' + str(num) + '.jpg')
            # 在一個(gè)給定的時(shí)間內(nèi)(單位ms)等待用戶(hù)按鍵觸發(fā),1ms
            cv2.waitKey(1)
        else:
            break
    # 視頻釋放
    vc.release()
    time.sleep(0.5)
    video_image(num)
# 第二步對(duì)圖片做灰度處理
def video_image(num=''):
    # 創(chuàng)建字符圖片文件夾
    folder_path = "bear/"
    if folder_path:
        pass
    else:
        os.makedirs(folder_path)
    for i in range(1, num):
        filename = 'img_bear/' + str(i) + '.jpg'
        im = Image.open(filename)  # 返回一個(gè)Image對(duì)象
        width = im.size[0]
        heigth = im.size[1]
        print('寬:%d,高:%d' % (im.size[0], im.size[1]))
        # 此字符表用于生字符幀,對(duì)應(yīng)256個(gè)像素,字符越多且不同樣式,字符幀越精細(xì)
        ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~            <>i!lI;:,\"^`'. ")
        # 判斷圖片是否存在
        if os.path.exists(filename):
            # 將圖片轉(zhuǎn)化為灰度圖像,并重設(shè)大小
            img_array = np.array(Image.open(filename).resize((160, 160), Image.ANTIALIAS).convert('L'))
            # 創(chuàng)建新的圖片對(duì)象
            img = Image.new('L', (width, heigth), 255)
            draw_object = ImageDraw.Draw(img)
            # 設(shè)置字體
            font = ImageFont.truetype('consola.ttf', 10, encoding='unic')
            # 根據(jù)灰度值添加對(duì)應(yīng)的字符
            for j in range(160):
                for k in range(160):
                    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')
    time.sleep(0.5)
    video(num)
# 第三步字符轉(zhuǎn)視頻

def video(num):
    filename = 'img_bear/' + str(1) + '.jpg'
    im = Image.open(filename)  # 返回一個(gè)Image對(duì)象
    width = im.size[0]
    heigth = im.size[1]
    # 設(shè)置視頻編碼器,這里使用使用MJPG編碼器
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    # 輸出視頻參數(shù)設(shè)置,包含視頻文件名、編碼器、幀率、視頻寬高(此處參數(shù)需和字符圖片大小一致)
    videoWriter = cv2.VideoWriter('bear_character.avi', fourcc, 20.0, (width, heigth))

    for i in range(1, num):
        filename = 'bear/'+str(i)+'.jpg'
        # 判斷圖片是否存在
        if os.path.exists(filename):
            img = cv2.imread(filename=filename)
            # 在一個(gè)給定的時(shí)間內(nèi)(單位ms)等待用戶(hù)按鍵觸發(fā),100ms
            cv2.waitKey(100)
            # 將圖片寫(xiě)入視頻中
            videoWriter.write(img)
            print(str(i) + '.jpg' + ' done!')
    # 視頻釋放
    videoWriter.release()
    time.sleep(1)
    # 刪除圖片
    remove_img()
    remove_img_bear()
# 原圖片刪除
def remove_img():
    files = os.getcwd()  # files中保存的是當(dāng)前的執(zhí)行目錄
    file_name = files + "/img_bear"
    del_list = os.listdir(file_name)
    for f in del_list:
        file_path = os.path.join(file_name, f)
        print(file_path)
        if os.path.isfile(file_path):
            os.remove(file_path)
            print('成功刪除文件:')
        else:
            print('未找到此文件:')
# 灰度圖片刪除
def remove_img_bear():
    files = os.getcwd()  # files中保存的是當(dāng)前的執(zhí)行目錄
    file_name = files + "/bear"
    del_list = os.listdir(file_name)
    for f in del_list:
        file_path = os.path.join(file_name, f)
        print(file_path)
        if os.path.isfile(file_path):
            os.remove(file_path)
            print('成功刪除文件:')
        else:
            print('未找到此文件:')
def main():
    video_img('video.mp4')


if __name__ == "__main__":
    main()

進(jìn)一步優(yōu)化

到了這里,核心功能基本都完成了。

不過(guò)仔細(xì)想想,其實(shí)還有很多可以做的:

什么是指定要轉(zhuǎn)換的區(qū)間、幀率?

每次轉(zhuǎn)換都要很久的時(shí)間,能不能邊轉(zhuǎn)換邊播放?或者轉(zhuǎn)換后把數(shù)據(jù)保存起來(lái),下次播放時(shí),就直接讀緩存

看下效果圖

總結(jié)

到此這篇關(guān)于python視頻轉(zhuǎn)化字節(jié)問(wèn)題的文章就介紹到這了,更多相關(guān)python視頻轉(zhuǎn)化字節(jié)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用xmltodict模塊實(shí)現(xiàn)處理XML數(shù)據(jù)

    Python利用xmltodict模塊實(shí)現(xiàn)處理XML數(shù)據(jù)

    理解和處理XML數(shù)據(jù)在Python中是一項(xiàng)常見(jiàn)任務(wù),xmltodict便是一個(gè)Python庫(kù),用于將XML數(shù)據(jù)解析為易于處理的Python字典,下面我們就來(lái)學(xué)習(xí)一下xmltodict庫(kù)的具體使用吧
    2023-11-11
  • 深入了解Python如何操作MongoDB

    深入了解Python如何操作MongoDB

    MongoDB是由C++語(yǔ)言編寫(xiě)的非關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。本文主要介紹了如何通過(guò)Python操作MongoDB,需要的可以參考一下
    2022-01-01
  • python連接數(shù)據(jù)庫(kù)后通過(guò)占位符添加數(shù)據(jù)

    python連接數(shù)據(jù)庫(kù)后通過(guò)占位符添加數(shù)據(jù)

    在pymysql中支持對(duì)占位符的處理,開(kāi)發(fā)者需要在SQL中使用“%”定義占位符,在使用excute()方法執(zhí)行時(shí)對(duì)占位符的數(shù)據(jù)進(jìn)行填充即可,本文給大家介紹python連接數(shù)據(jù)庫(kù)后通過(guò)占位符添加數(shù)據(jù)的方法,需要的朋友參考下吧
    2021-12-12
  • python制作花瓣網(wǎng)美女圖片爬蟲(chóng)

    python制作花瓣網(wǎng)美女圖片爬蟲(chóng)

    本文通過(guò)python 來(lái)實(shí)現(xiàn)這樣一個(gè)簡(jiǎn)單的爬蟲(chóng)功能,把我們想要的圖片爬取到本地,需要的朋友可以參考下
    2015-10-10
  • Python中urllib2模塊的8個(gè)使用細(xì)節(jié)分享

    Python中urllib2模塊的8個(gè)使用細(xì)節(jié)分享

    這篇文章主要介紹了Python中urllib2模塊的8個(gè)使用細(xì)節(jié)分享,本文講解了Proxy設(shè)置、Timeout設(shè)置、加入特定Header、Redirect、Cookie、PUT和DELETE方法等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 使用celery執(zhí)行Django串行異步任務(wù)的方法步驟

    使用celery執(zhí)行Django串行異步任務(wù)的方法步驟

    這篇文章主要介紹了使用celery執(zhí)行Django串行異步任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python畫(huà)圖練習(xí)案例分享

    Python畫(huà)圖練習(xí)案例分享

    這篇文章主要介紹了Python畫(huà)圖練習(xí)案例分享,文章基于Python實(shí)現(xiàn)各種畫(huà)圖,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-07-07
  • Python、PyCharm安裝及使用方法(Mac版)詳解

    Python、PyCharm安裝及使用方法(Mac版)詳解

    這篇文章主要為大家詳細(xì)介紹了Mac版的Python、PyCharm安裝及使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • python處理大日志文件

    python處理大日志文件

    這篇文章主要為大家詳細(xì)介紹了python處理大日志文件的的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python selenium的基本使用方法分析

    Python selenium的基本使用方法分析

    這篇文章主要介紹了Python selenium的基本使用方法,結(jié)合實(shí)例形式分析了Python使用selenium模塊進(jìn)行web自動(dòng)化測(cè)試的基本模塊導(dǎo)入、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12

最新評(píng)論

镇宁| 临颍县| 隆德县| 怀集县| 济宁市| 富阳市| 孟津县| 沙湾县| 诸城市| 邹平县| 麻阳| 新民市| 江华| 桦南县| 乌兰浩特市| 通渭县| 宁城县| 二手房| 康定县| 宜都市| 石楼县| 秦皇岛市| 乌鲁木齐市| 大同县| 岳池县| 从化市| 轮台县| 杭锦后旗| 咸阳市| 区。| 望谟县| 乐至县| 泰和县| 吴堡县| 米脂县| 牡丹江市| 康马县| 东平县| 岑巩县| 新巴尔虎左旗| 扎鲁特旗|