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

news/2024/11/27 20:36:53/

基于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 nppath = "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 % 8y = j % 8y_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 += 1y -= 1y = 0if x == 368:x -= 1else:         # 偶数,向上走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 -= 1y += 1x = 0else: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 += 1y -= 1x = row - 1y = y + 2else:         # 偶数,向上走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 -= 1y += 1x += 2y = column - 1

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

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


http://www.ppmy.cn/news/18639.html

相关文章

一起自学SLAM算法:7.3 估计理论

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 不管是用贝叶斯网络还是因子图&#xff0c;一旦SLAM问题用概率图模型得到表示后&#xff0c;接下来就是利用可观测量&#xff08;和&#xff09;推理不可观测量&#xff08;和&#xff09;&#xff0c;也就是说S…

8种时间序列分类方法总结

对时间序列进行分类是应用机器和深度学习模型的常见任务之一。本篇文章将涵盖 8 种类型的时间序列分类方法。这包括从简单的基于距离或间隔的方法到使用深度神经网络的方法。这篇文章旨在作为所有时间序列分类算法的参考文章。 时间序列定义 在涵盖各种类型的时间序列 (TS) 分…

机器学习数据挖掘作业:基于BP神经网络、决策树、朴素贝叶斯网络的旧金山犯罪分类案例

研究内容 根据数据进行分类模型的构建 要求: 用python实现学习算法至少实现2-3种不同类型的学习算法(贝叶斯、神经网络、决策树等)要求比较和分析通过不同学习算法建立的模型的准确率数据自行查找合适的数据源,但不得少于1000条研究环境 系统环境: Windows 10 学生版 语言…

Week 12

洛谷P1776 宝物筛选 题目描述 终于&#xff0c;破解了千年的难题。小 FF 找到了王室的宝物室&#xff0c;里面堆满了无数价值连城的宝物。 这下小 FF 可发财了&#xff0c;嘎嘎。但是这里的宝物实在是太多了&#xff0c;小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能…

数学表达式的处理

概述 在OJ上 会遇到一些这样的题目&#xff1a; 小明同学写数学四则运算&#xff0c;有把括号写多、写少、写错的情况&#xff0c;比如&#xff08;AB)*(C-D &#xff0c;请你输入一个表达式&#xff0c;判断此表达式的括号是否正确(不考虑运算的结果正确性)。 每次我看到 &q…

Word2Vec与文章相似度--相似度计算

2.7.4.2 相似度计算 目的&#xff1a;计算18号Python频道的文章之间相似度步骤&#xff1a; 1、读取数据&#xff0c;进行类型处理(数组到Vector)2、BRP进行FIT 读取数据&#xff0c;进行类型处理(数组到Vector) from pyspark.ml.linalg import Vectors # 选取部分数据做测试…

Linux系统之Bonding 网卡绑定配置方法

Linux系统之Bonding 网卡绑定配置方法一、检查本地系统环境1.检查系统版本2.查看服务器网卡二、创建网卡配置文件1.进入网卡配置文件目录2.拷贝eth0的网卡配置文件3.修改bond0网卡配置文件4.修改eth1网卡配置文件5.修改eth2网卡配置文件三、创建bonding的配置文件1.编辑bonding…

Java之Io知识详解 (二)

常见类使用常见类使用IO常见类的使用File相关字节流相关实现逐行输出文本文件的内容Java 中的网络支持InetAddressURLSocketsJava 7 文件操作介绍文件路径文件操作文件属性文件列表流文件监视常见类使用 本文主要介绍Java IO常见类的使用&#xff0c;包括&#xff1a;磁盘操作&…