基于ffmpeg的视频处理与MPEG的压缩试验(下载安装使用全流程)

news2024/12/26 1:05:07

基于ffmpeg的视频处理与MPEG的压缩试验

  • ffmpeg介绍与基础知识
  • 对提取到的图像进行处理
    • RGB并转化为YUV
    • 对YUV进行DCT变换
    • 对每个8*8的图像块进行进行量化操作

ffmpeg介绍与基础知识

ffmpeg是视频和图像处理的工具包,它的下载网址是https://ffmpeg.org/download.html。页面都是英文且下载正确的包的路径笔者找的时候还费点劲,这里记录一下也方便读者。

选中这个Windows下的下午files,选择第一个
在这里插入图片描述
这里有essential和full版本的,大家根据需要自行选择版本包下载
在这里插入图片描述
下载好之后,在官网上下载ffmpeg的full包,一共300+MB
解压,然后安装bin到环境变量中以便cmd中(windoows系统下)命令行的使用
下面将视频提取为一幅一幅的图片
使用如下命令提取格式为png的图片

ffmpeg.exe -i "The godfather (1972) clip.mp4" -vf fps=10 %03d.png

具体的ffmpeg命令格式与定义可以直接在本站搜索定义,这里也给出网址ffmpeg命令
生成的图片会保存在分解的视频目录下。

IPB三种帧是视频压缩中的重要概念,这里找到了学习资料,提供给大家参考I.P.B帧

对提取到的图像进行处理

RGB并转化为YUV

首先要导入opencv的包,没有要下载安装一下到IDE中,然后进行RGB矩阵的提取

import cv2
import numpy as np

path = "150.png"
figure = cv2.imread(path)
# 提取出RGB并根据公式转化为YUV
b = figure[:,:,0]
g = figure[:,:,1]
r = figure[:,:,2]

根据RGB转化为YUV的公式,计算出YUV矩阵,共三个通道

y = 0.275 * r + 0.504 * g + 0.098 * b + 16
u = -0.148 * r - 0.291 * g + 0.439 * b + 128
v = 0.439 * r - 0.368 * g - 0.071 * b + 128

对YUV进行DCT变换

DCT变换是傅里叶变换,在图像处理乃至电气领域等都有广泛的应用,在抛去原理的情况下,直接调用函数库就能完成操作了。默认的是进行8*8的图像块为基本单位的DCT变换,代码如下:

y_dct = cv2.dct(y)
u_dct = cv2.dct(u)
v_dct = cv2.dct(v)

作完DCT变换之后,要对中间的结果进行量化操作,以便更好存储,单位范围也更规整
且给出两个量化表进行量化

# 两个量化表
co1 = [[17,18,24,47,99,99,99,99],[18,21,26,66,99,99,99,99],
       [24,26,59,99,99,99,99,99],[47,66,99,99,99,99,99,99],
       [99,99,99,99,99,99,99,99],[99,99,99,99,99,99,99,99],
       [99,99,99,99,99,99,99,99],[99,99,99,99,99,99,99,99]]
co2 = [[16,11,10,16,24,40,51,61],[12,12,14,19,26,58,60,55],
       [14,13,16,24,40,57,69,56],[14,17,22,29,51,87,80,62],
       [18,22,37,56,68,109,103,77],[24,35,55,64,81,104,113,92],
       [49,64,78,87,103,121,120,101],[97,92,95,98,112,100,103,99]]

co1是对应y,而co2是对应u和v的

对每个8*8的图像块进行进行量化操作

y_q = np.zeros((len(y_dct),len(y_dct[0])))
u_q = np.zeros((len(u_dct),len(u_dct[0])))
v_q = np.zeros((len(v_dct),len(v_dct[0])))
for i in range(len(y_dct)):
       for j in range(len(y_dct[0])):
              x = i % 8
              y = j % 8
              y_q[i][j] = int(y_dct[i][j] / co1[x][y])
              u_q[i][j] = int(u_dct[i][j] / co2[x][y])
              v_q[i][j] = int(v_dct[i][j] / co2[x][y])

在完成了图像处理之后,我们还需要将它保存起来,这里就需要用到z字型的编码进行保存
顾名思义,就是将矩阵按z字型来保存元素至一位的数组中。
根据z字型编码排列的规则,对量化完之后的结果矩阵进行编码并输出。Z字型的编码的好处是,相邻的元素之间在物理意义上也是相邻的,这样更能挖掘出规律,同时也能更好适用于算法。
z字型编码的代码笔者写了一个如下(有点繁琐,没有进行优化):

row,column = len(y_q),len(y_q[0])
print(row,column)
z_y = []
z_u = []
z_v = []
length = column + row
x = y = 0
for i in range(length):
       if i < column:
              if i % 2:     # 奇数,向下走
                     while x <= row-1 and y >= 0:
                            z_y.append(y_q[x][y])
                            z_u.append(u_q[x][y])
                            z_v.append(v_q[x][y])
                            x += 1
                            y -= 1
                     y = 0
                     if x == 368:
                            x -= 1
              else:         # 偶数,向上走
                     while x >= 0 and y <= column-1:
                            z_y.append(y_q[x][y])
                            z_u.append(u_q[x][y])
                            z_v.append(v_q[x][y])
                            x -= 1
                            y += 1
                     x = 0
       else:
              if i % 2:     # 奇数,向下走
                     while x <= row-1 and y <= column-1:
                            z_y.append(y_q[x][y])
                            z_u.append(u_q[x][y])
                            z_v.append(v_q[x][y])
                            x += 1
                            y -= 1
                     x = row - 1
                     y = y + 2
              else:         # 偶数,向上走
                     while x >= 0 and y <= column-1:
                            z_y.append(y_q[x][y])
                            z_u.append(u_q[x][y])
                            z_v.append(v_q[x][y])
                            x -= 1
                            y += 1
                     x += 2
                     y = column - 1

注:代码整合到一个.py文件中都能运行,且有连贯性,这里是为了方便讲解所以分开了。笔者这里也将资料上传到资源中,里面还有ffmpeg直接下好的工具包,嫌麻烦的读者也可以直接下载完整的来使用。链接

此文写于2023年1月1日,因为一些原因过几天再发,但祝大家元旦快乐,新的一年有新气象,向自己的目标继续进发!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高级

存储引擎 MySQL体系结构&#xff1a; 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 相关操作&#xff1a; -- 查询建表语句 show create table ac…

Python量化交易07——散户反买策略

参考来源&#xff1a;b站up 邢不行 我们都知道在A股&#xff0c;散户一直是最大的韭菜贡献组群。散户买入多的个股&#xff0c;大概率可能跌的很惨&#xff0c;散户卖出多的股票&#xff0c;大概率会涨。 跟着北向资金买能赚钱&#xff0c;那么跟着散户反买&#xff0c;是不是…

宝塔面板部署Django项目教程(手把手)

一、测试环境 系统&#xff1a;centos 7.9 CPU&#xff1a;1核 内存&#xff1a;2G 二、安装宝塔面板 输入命令&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 后面会…

【nvidia CUDA 高级编程】使用cub库优化分布式计算下的原子操作

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

MySQL数据库相关错题本

1) MySQL数据库相关错题本1、存储引擎相关1、MySql的存储引擎的不同MySQL存储引擎主要有InnoDB, MyISAM, Memory, 这三个区别在于:Memory是内存数据引擎, 会断电重启(在双M或者主从架构下会产生较多异常), 且不支持行级锁. 默认索引是数组索引, 支持B索引InnoDB和MyISAM的区别:…

【React全家桶】react简介(一)

react简介创建项目creat-react-app1.1 React特点1.2 引入文件1.3 JSX1.3.1 为什么要用JSX1.3.2 JSX语法规则1.4 虚拟DOM1.5 模块与组件1.5.1 模块React面向组件编程2.1 创建组件2.1.1 函数式组件2.1.2 类式组件2.2 组件实例的三大属性2.2.1 state属性2.2.2 props属性2.2.3 refs…

jvm学习的核心(三)---运行时数据区详解(2)

文章目录1.堆&#xff08;heap&#xff09;1.1 堆的概述1.2 堆的内部结构1.3 堆分代垃圾回收流程的简单理解2.方法区&#xff08; Method Area&#xff09;2.1 HotSpot方法区的演进2.2方法区的内部结构2.3.1 常量池和运行时常量池概念区别1.堆&#xff08;heap&#xff09; 1.1…

Linux常用命令——supervisord命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) supervisord 配置后台服务/常驻进程的进程管家工具 安装 # 安装 supervisord apt-get install supervisor实例 生成配置文件/etc/supervisord.conf [program:app] command/usr/bin/gunicorn -w 1 wsgiapp:ap…

Java面试2

Java面试2目录概述需求&#xff1a;设计思路实现思路分析1.java 面试题参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

学习记录665@项目管理之项目成本管理

友情提示&#xff1a;对于这部分书上的内容&#xff0c;我个人认为是花里胡哨&#xff0c;形式大于内容的&#xff0c;特别是涉及到很多挣值管理有些指标和公式&#xff0c;没有任何例子&#xff0c;死板生硬。 什么是项目成本管理 项目管理受范围、时间、成本和质量的约束&am…

回溯——排列组合

1.组合(结果不区分顺序) 1.同一个集合求组合需要startindex 需要startindex 1.元素可以重复使用 startindex为i 例&#xff1a; lc39[组合总和] 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组…

C进阶_内存库函数_和这群虫豸在一起,怎能搞好政治呢?

其实之前我写过这篇……但是不够详细&#xff01;今天重新写一下。 目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcpy 它的函数原型是&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 查阅文档它的文档&#xff1a; C…

帮助有一定计算机基础的人 快速复习并重新拾起C语言基础(数据类型篇)

数据类型 帮助有一定计算机基础的人 快速复习并重新拾起C语言基础C语言数据类型分类基本数据类型整型类型的分类整型类型的基本用法有符号与无符号的区别字符型数据转义字符char 类型的范围浮点数类型数据字符串常量字符串输入之scanf函数字符输入输出函数算术运算符比较运算符…

SPI-读写串行FLASH

简介 是由摩托罗拉公司提出的通讯协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广 泛地使用在ADC、LCD等设备与MCU间&#xff0c;要求通讯速率较高的场合。特性 1、全双工&#xff08;即可以同时收发&#xff09;2、最少需要占用4条线&…

图解统计学 10 | 贝叶斯公式与全概率公式

文章目录概率联合概率条件概率全概率公式贝叶斯公式过年了&#xff0c;作为水果店老板的我们&#xff0c;一共进了三种水果&#xff0c;其中&#xff1a;西瓜&#xff1a;50个 香蕉&#xff1a;30个 橙子&#xff1a;20个 为了方便顾客挑选&#xff0c;放在如下的格子里&…

[Android]Shape Drawable

ShapeDrawable可以理解为通过颜色来构造的图形 <android.widget.Buttonandroid:id"id/button1"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Button"android:background"drawable/sha…

MongoDB学习笔记【part4】SpringBoot集成MongoDB、MongoTemplate开发CURD

一、Spring Boot 集成 Mongodb spring-data-mongodb 提供了 MongoTemplate 与 MongoRepository 两种方式访问mongodb&#xff0c;MongoRepository 操作简单&#xff0c;但 MongoTemplate 更加灵活&#xff0c;我们在项目中可以灵活使用这两种方式操作mongodb。 第一步&#x…

铸造性能监控平台【grafana+influxdb/prometheus+Linux/Windows】

目录一、grafanainfluxdbjmeter1、前言2、安装grafana和influxdb3、启动grafana4、访问grafana5、启动influxdb6、配置influxdb和jmeter7、在grafana中显示数据8、其他模板二、grafanaprometheusexporter1、前言2、grafana启动3、exporter安装与运行4、prometheus安装与运行5、…

代码随想录算法训练营第23天 二叉树 java : 669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树

文章目录LeetCode 669. 修剪二叉搜索树题目讲解思路LeetCode 108.将有序数组转换为二叉搜索树题目讲解思路LeetCode 538.把二叉搜索树转换为累加树题解思路总结LeetCode 669. 修剪二叉搜索树 题目讲解 思路 在1到3的区间选择 元素 如何超过3 或者 小于1 如果小于1 叫要考虑 …

NeRF: Representing Scenesas Neural Radiance Fieldsfor View Synthesis论文阅读

注意&#xff1a;和很多文章一样&#xff0c;在Google搜索到最终版本时&#xff0c;有链接指出其有7个历史版本&#xff0c;但内容较详细的却不是最终版本&#xff0c;而是ECCV (2020)版&#xff0c;阅读时可以两个版本配合着阅读。 1. 摘要 我们提出了一种方法&#xff0c;通…