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 相关文章推荐
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
Python 中的with关键字使用详解
Sep 11 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
flask-restful使用总结
Dec 04 Python
Python3中的bytes和str类型详解
May 02 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Python 支持向量机分类器的实现
Jan 15 Python
python with (as)语句实例详解
Feb 04 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
波兰在线运动商店:YesSport
2020/07/23 全球购物
求网格中的黑点分布
2013/11/06 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
三万活动总结
2014/04/28 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书