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登录QQ邮箱发信的实现代码
Feb 10 Python
为Python的web框架编写前端模版的教程
Apr 30 Python
详解Python编程中time模块的使用
Nov 20 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
python做接口测试的必要性
Nov 20 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
keras实现图像预处理并生成一个generator的案例
Jun 17 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 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
Zend的Registry机制的使用说明
2013/05/02 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
python3实现猜数字游戏
2020/12/07 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
财务负责人任命书
2014/06/06 职场文书
学习十八大的心得体会
2014/09/12 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年学生会工作总结
2014/11/07 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
宾馆安全管理制度
2015/08/06 职场文书
Golang流模式之grpc的四种数据流
2022/04/13 Golang