[Python,Pandas]交流群 164142295

前阵子下载了很多电影,造成磁盘空间严重不足,为了节约小钱钱于是萌生了将H264电影压缩成HEVC的念头。

本程序在Win10中开发,并通过测试。

接下来是几点说明

1. 这段代码用到pymediainfo库,具体安装请自行百度。

2. 关于控制视频质量的参数。函数 bit_rate_control 返回输出视频的码率,如果原始视频码率低于1800kbps,则输出体积大约是原视频的70%大小。码率超过 20000kbps 如果,则输出文件约为原视频的20%(一般来说,细节损失还可以接受)。经过大量实践1080P 30fps的影片大约需要 2500kbps - 3000kbps 以保证不会出现大量马赛克。

3. 主函数中 encoder 的说明,

- hevc_nvenc, 网上文章说是NVIDIA CUDA加速,笔者没测试过

- hevc_mf,NVIDIA显卡的硬件加速选项,在笔者笔记本的NVIDIA显卡测试过,可以使用

- hevc_amf ,AMD显卡硬件加速使用的参数,由于笔者使用AMD,所以为代码默认

- hevc_qsv, Intel显卡硬件加速使用的参数

- libx265, 软件编码使用的参数,压缩速度比硬件加速慢上好多倍

4. preset 参数,请参考文章 (55条消息) x265的编码参数preset级别对性能的影响_wu_qz的博客-CSDN博客_-preset superfasthttps://blog.csdn.net/Wu_qz/article/details/89499415选项如下,

- ultrafast

- superfast

- veryfast

- faster

- fast

- medium

- slow

- slower

- veryslow

- placebo'

5. Resource.txt存放需要转码文件的绝对路径,用换行符隔开

6. 程序会根据文件质量大致估算需要的码率进行压缩

7. 本程序生成ffmpeg命令,并保存在D:\BatchConvert.bat,不会自动转码。需要手动执行,这点很重要。

接下来是代码

from pathlib import Path
from pymediainfo import MediaInfo
import jsondef bit_rate_control(in_bitrate):x1, y1 = 1800, 0.7x2, y2 = 20000, 0.2if x1 <= in_bitrate <= x2:return (in_bitrate - x1) * (y2 - y1) / (x2 - x1) + y1if in_bitrate <= x1:return y1if in_bitrate >= x2:return y2def is_hevc(input_str: str):input_str = input_str.lower()is_hevc_array = (1 if 'x265' in input_str else 0,1 if 'x.265' in input_str else 0,1 if 'h265' in input_str else 0,1 if 'h.265' in input_str else 0,1 if 'hevc' in input_str else 0)return any(is_hevc_array)class VideoAnalysis:def __init__(self, file_path: Path):self.f = file_pathself.f_size = self.f.stat().st_size / 1024self.media_info = MediaInfo.parse(input_file)self.data = self.media_info.to_json()self.data = json.loads(self.data)['tracks']def get_height(self):return int(self.data[1]['height'])def get_fps(self):return float(self.data[1]['frame_rate'])def get_bit_rate(self):br = self.actual_bit_rate_cal()return int(br * bit_rate_control(br))def get_duration(self):data = self.data[0]return data['other_duration'][2]def actual_bit_rate_cal(self):data = self.data[0]in_str = data['other_duration'][3].split('.')[0]in_str = in_str.split(':')in_str = [int(i) for i in in_str]duration = in_str[0] * 3600 + in_str[1] * 60 + in_str[2]return round(self.f_size * 8 / duration, 2)def partition(idx, input_file):input_file = Path(input_file)if is_hevc(str(input_file.name)) or not input_file.is_file() or 'bat' in str(input_file):return Nonefa = VideoAnalysis(input_file)file_name = input_file.stem.lower()new_file_name: str = input_file.stemtry:bit_rate = fa.get_bit_rate()except KeyError:bit_rate = 2560if bit_rate <= 2500:print('Pass', idx, bit_rate, input_file)returnfile_name = new_file_name.replace('264', 'HEVC') if ('h264' in file_name or 'x264' in file_nameor 'h.264' in file_name) else f'{new_file_name}_HEVC'new_suffix = 'mkv' if input_file.suffix == 'mkv' else 'mp4'paras = f'-preset {preset} -map 0 -c:v {encoder} -x265-params "crf={crf}:psy-rd=1" -b:v {bit_rate}k'output_file = fr'D:\HEVC\{file_name.replace("  ", "")}.{new_suffix}'cmd = fr'ffmpeg -threads 4 -i "{input_file}" {paras} "{output_file}"'rem = fr'Rem "BitRate {fa.actual_bit_rate_cal()} kbps, {fa.get_height()}P , {fa.get_fps()} FPS , ' \fr'{fa.get_duration()} ,{input_file.name}"'return rem, cmdif __name__ == '__main__':# 这个txt文件存放需要转码文件的绝对路径,用换行符隔开root_f = Path(r'D:\256G\Repositories\RFM\EXTData\Resource.txt')fs = root_f.read_text(encoding='UTF-8').split('\n')# 'ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo'preset = 'slower'# encoder='hevc_nvenc hevc_mf hevc_amf hevc_qsv libx265 vp9_qsv'encoder = 'hevc_amf'pass_num = 2batch_contents = []# lower is better , range 0-50crf = 12for idx, input_file in enumerate(fs):print(idx, input_file)try:if ret := partition(idx, input_file):batch_contents.extend(ret)except KeyError:print(f'{idx} KeyError ! {input_file}')continuePath(r'D:\BatchConvert.bat'). \write_text('\n'.join(batch_contents), encoding='gb18030')

Python自动生成ffmpeg转码HEVC (X265,H265) 命令相关推荐

  1. Python自动生成金钱豹收款码_一蓑烟雨任平生

    文章目录 前言 一.先看下成品(支持你们扫码哈) 二.上代码 总结 前言 最近金钱豹收款码比较火,一张一张PS是不是很恶心,做好一个模板,直接嵌套,批量生成怎么样 提示:以下是本篇文章正文内容,下面案 ...

  2. 用Python自动生成NBA巨星生涯数据曲线

    1.序 之前写过一个用 python 自动生成球员职业生涯数据的程序(原文请关注本人公众号),大家的反响很好,我也感到很欣慰.有问我怎么做的,如何学 python 的,也有提建议说集成到 web 里面 ...

  3. 通过web系统实现淘宝营销引流,小说或者视频上传之后自动生成二维码,通过二维码分享之后引入微信或者扣扣加群,群满自动切换到下一个,以及数据统计分析和若干个小工具集成

    通过web系统实现淘宝营销引流,小说或者视频上传之后自动生成二维码,通过二维码分享之后引入微信或者扣扣加群,群满自动切换到下一个,以及数据统计分析和若干个小工具集成. 主要实现技术: 1.大文件视频分 ...

  4. 情人节到了,用Python自动生成520照片墙吧~

    导语 情人节到了,用Python自动生成520照片墙可好,没有对象的自己看 相关文件 关注微信公众号 Python日志, 公众号内回复'照片墙'获取. 视频教学 视频教学:哔哩哔哩照片墙制作 开发工具 ...

  5. python一键生成二维码/条形码并保存成图片

    QRCode是生成二维码的库,采用里德-所罗门码来进行编码,里德-所罗门码是一种带有容错机制的编码方法,采用这种机制扫描的时候并不需要读取所有的比特位,因此也使得简单的在QRcode中少量的更改信息, ...

  6. 快递取件码生成软件_一种自动生成取件码的快递柜及其使用方法与流程

    本发明涉及快递柜技术领域,尤其是自动生成取件码的快递柜及其使用方法. 背景技术: 近年来,随着快递业的迅速发展,快递柜的应用也越发广泛.为了解决快递智能存储问题,许多小区已经安装了智能快递柜,快递员将 ...

  7. 微信二维码来源统计自动生成二维码统计?

    微信二维码来源统计,我们先来了解下渠道二维码,我们的微信公众号使用渠道二维码可以实现记录粉丝是通过二维码扫描关注并进入活动功能的统计,渠道二维码还可以让粉丝扫码后直接关注成为粉丝并直接弹出微信活动的页 ...

  8. vue 项目中 自动生成 二维码

    vue 项目中 自动生成 二维码 ​ 最近在写一个vue项目,要求根据卡号可以自动生成一个二维码,并渲染在指定位置,因为第一次做类似业务,小编在网上找了找,发现了很多,具体起来主要用的就两种: QRc ...

  9. python自动汇总表格_用Python自动生成Excel报表

    作者 / 来源:林骥(ID:linjiwx) 01 安装和导入模块 以 Python 中的 openpyxl 模块为例,它能够读取和修改 Excel 文件,如果你还没有安装,可以通过以下命令进行安装: ...

最新文章

  1. 【青少年编程】【三级】 合作画画
  2. php mysql操作封装_php封装MySQL数据库基本操作
  3. EvalAI使用——类似kaggle的开源平台,不过没有kernel fork功能,比较蛋疼
  4. Python入门100题 | 第050题
  5. 如何写一篇酷炫的博文(博文列表中展现字幕)
  6. mysql文字字符集_MySQL字符集
  7. java 偏移符号_java中的移位运算符总结
  8. python从视频中提取音频_提取视频中的音频——python三行程序搞定!
  9. PHP递归实现无限极分类
  10. 第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotion模拟器...
  11. 菌群多样性检测_多样性丰富了中学Linux用户群
  12. Ext JS 5的声明式事件监听
  13. python3怎么安装docx_如何在 Python 3.4 上安装 python-docx
  14. 外联样式表添加到html中,CSS联样式表之内联式、外联式和嵌入式
  15. 设置OWA重定向URL
  16. Git:操作报错:fatal: ‘origin‘ does not appear to be a git repository解决方案
  17. Android 12 原生播放器的编解码 Codec 2
  18. 职工信息管理系统设计c语言,c语言之职工信息管理系统设计.doc
  19. plsqldev连接远程oracle
  20. python vtk_Python vtk.vtkRenderer方法代码示例

热门文章

  1. JavaScript - 解析JSON
  2. java的Map接口
  3. 使用IDEA如何将项目打包成war包
  4. 合并m3u8文件 okfun文件夹 .ok文件
  5. 缓解 WPF 应用程序中的空域问题
  6. mysql 批量插入数据方法_mysql大批量插入数据的4种方法示例
  7. ETC收费交易流程规范
  8. gensim学习之corpora.Dictionary
  9. iOS-音频播放 AVAudioPlayer
  10. 马蜂窝裁php换java,php又又又凉凉了吗