python如何实现视频转代码视频


Posted in Python onJune 17, 2019

本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下

# -*- coding:utf-8 -*-
#coding:utf-8
import argparse
import os
import cv2
import subprocess
from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize
from PIL import Image, ImageFont, ImageDraw
 
# 命令行输入参数处理
# aparser = argparse.ArgumentParser()
# aparser.add_argument('file')
# aparser.add_argument('-o','--output')
# aparser.add_argument('-f','--fps',type = float, default = 24)#帧
# aparser.add_argument('-s','--save',type = bool, nargs='?', default = False, const = True)
# 是否保留Cache文件,默认不保存
 
# 获取参数
# args = parser.parse_args()
# INPUT = args.file
# OUTPUT = args.output
# SAVE = args.save
# FPS = args.fps
# 像素对应ascii码
 
 
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:oa+>!:+. ")
 
 
# ascii_char = list("MNHQ$OC67+>!:-. ")
# ascii_char = list("MNHQ$OC67)oa+>!:+. ")
 
# 将像素转换为ascii码
def get_char(r, g, b, alpha=256):
  if alpha == 0:
    return ''
  length = len(ascii_char)
  gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
  unit = (256.0 + 1) / length
  return ascii_char[int(gray / unit)]
 
 
# 将txt转换为图片
def txt2image(file_name):
  im = Image.open(file_name).convert('RGB')
  # gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色
  raw_width = im.width
  raw_height = im.height
  width = int(raw_width / 6)
  height = int(raw_height / 15)
  im = im.resize((width, height), Image.NEAREST)
 
  txt = ""
  colors = []
  for i in range(height):
    for j in range(width):
      pixel = im.getpixel((j, i))
      colors.append((pixel[0], pixel[1], pixel[2]))
      if (len(pixel) == 4):
        txt += get_char(pixel[0], pixel[1], pixel[2], pixel[3])
      else:
        txt += get_char(pixel[0], pixel[1], pixel[2])
    txt += '\n'
    colors.append((255, 255, 255))
 
  im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))
  dr = ImageDraw.Draw(im_txt)
  # font = ImageFont.truetype(os.path.join("fonts","汉仪楷体简.ttf"),18)
  font = ImageFont.load_default().font
  x = y = 0
  # 获取字体的宽高
  font_w, font_h = font.getsize(txt[1])
  font_h *= 1.37 # 调整后更佳
  # ImageDraw为每个ascii码进行上色
  for i in range(len(txt)):
    if (txt[i] == '\n'):
      x += font_h
      y = -font_w
      # self, xy, text, fill = None, font = None, anchor = None,
      #*args, ** kwargs
    dr.text((y, x), txt[i], fill=colors[i])
    #dr.text((y, x), txt[i], font=font, fill=colors[i])
    y += font_w
 
  name = file_name
  #print(name + ' changed')
  im_txt.save(name)
 
 
# 将视频拆分成图片
def video2txt_jpg(file_name):
  vc = cv2.VideoCapture(file_name)
  c = 1
  if vc.isOpened():
    r, frame = vc.read()
    if not os.path.exists('Cache'):
      os.mkdir('Cache')
    os.chdir('Cache')
  else:
    r = False
  while r:
    cv2.imwrite(str(c) + '.jpg', frame)
    txt2image(str(c) + '.jpg') # 同时转换为ascii图
    r, frame = vc.read()
    c += 1
  os.chdir('..')
  return vc
 
 
# 将图片合成视频
def jpg2video(outfile_name, fps):
  fourcc = VideoWriter_fourcc(*"MJPG")
 
  images = os.listdir('Cache')
  im = Image.open('Cache/' + images[0])
  vw = cv2.VideoWriter(outfile_name + '.avi', fourcc, fps, im.size)
 
  os.chdir('Cache')
  for image in range(len(images)):
    # Image.open(str(image)+'.jpg').convert("RGB").save(str(image)+'.jpg')
    frame = cv2.imread(str(image + 1) + '.jpg')
    vw.write(frame)
    #print(str(image + 1) + '.jpg' + ' finished')
  os.chdir('..')
  vw.release()
 
 
# 递归删除目录
def remove_dir(path):
  if os.path.exists(path):
    if os.path.isdir(path):
      dirs = os.listdir(path)
      for d in dirs:
        if os.path.isdir(path + '/' + d):
          remove_dir(path + '/' + d)
        elif os.path.isfile(path + '/' + d):
          os.remove(path + '/' + d)
      os.rmdir(path)
      return
    elif os.path.isfile(path):
      os.remove(path)
    return
 
 
# 调用ffmpeg获取mp3音频文件
def video2mp3(file_name):
  outfile_name = file_name.split('.')[0] + '.mp3'
  subprocess.call('ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name, shell=True)
 
 
# 合成音频和视频文件
def video_add_mp3(file_name, mp3_file):
  outfile_name = file_name.split('.')[0] + '-txt.mp4'
  subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 ' + outfile_name, shell=True)
 
 
if __name__ == '__main__':
  INPUT = r"G:\py\学习python\视频到代码\video39.mp4"
  OUTPUT = r"G:\py\学习python\视频到代码\video39_2.mp4"
  SAVE = r"G:\py\学习python\视频到代码\\video39_3"
  FPS = "24"
  vc = video2txt_jpg(INPUT)
  FPS = vc.get(cv2.CAP_PROP_FPS) # 获取帧率
  print(FPS)
 
  vc.release()
 
  jpg2video(INPUT.split('.')[0], FPS)
  print(INPUT, INPUT.split('.')[0] + '.mp3')
  video2mp3(INPUT)
  video_add_mp3(INPUT.split('.')[0] + '.avi', INPUT.split('.')[0] + '.mp3')
 
  if (not SAVE):
    remove_dir("Cache")
    os.remove(INPUT.split('.')[0] + '.mp3')
    os.remove(INPUT.split('.')[0] + '.avi')

流程图:

这次python编程的流程图如下: 

python如何实现视频转代码视频

注意事项:

在编程的过程中有需要注意的几点:

  • 这次编程使用到了opencv库,需要安装
  • 帧率的获取可以通过这个函数——FPS = vc.get(cv2.CAP_PROP_FPS)
  • 合成后的视频是没有声音的,我们使用ffmpeg进行合成

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的一个简单LRU cache
Sep 26 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
python实现list由于numpy array的转换
Apr 04 Python
详解小白之KMP算法及python实现
Apr 04 Python
python实现抖音点赞功能
Apr 07 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
python解析命令行参数的三种方法详解
Nov 29 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
Python多线程thread及模块使用实例
Apr 28 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
python批量爬取下载抖音视频
Jun 17 #Python
python批量下载抖音视频
Jun 17 #Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 #Python
python文本数据处理学习笔记详解
Jun 17 #Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 #Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 #Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 #Python
You might like
php4的session功能评述(二)
2006/10/09 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
php使浏览器直接下载pdf文件的方法
2013/11/15 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
20个常用Python运维库和模块
2018/02/12 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python3中rank函数的用法
2019/11/27 Python
详解python程序中的多任务
2020/09/16 Python
Django celery异步任务实现代码示例
2020/11/26 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
编写strcpy函数
2014/06/24 面试题
介绍一下Java的事务处理
2012/12/07 面试题
Unix/Linux开发面试题
2016/08/16 面试题
写给女生的道歉信
2014/01/14 职场文书
运动会稿件100字
2014/02/21 职场文书
法人授权委托书
2014/04/03 职场文书
四年级评语大全
2014/04/21 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
起诉书范文
2015/05/20 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS