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编写一个最基础的代码解释器的要点解析
Jul 12 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
Python玩转加密的技巧【推荐】
May 13 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
python [:3] 实现提取数组中的数
Nov 27 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
python实现AdaBoost算法的示例
Oct 03 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 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
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
Symfony核心类概述
2016/03/17 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
jcrop基本参数一览
2013/07/16 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
对比分析json及XML
2014/11/28 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
在小程序开发中使用npm的方法
2018/10/17 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python 读取文件并替换字段的实例
2018/07/12 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
终端业务员岗位职责
2013/11/27 职场文书
师范毕业生求职信
2014/07/11 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
python全面解析接口返回数据
2022/02/12 Python