基于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日,因为一些原因过几天再发,但祝大家元旦快乐,新的一年有新气象,向自己的目标继续进发!

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

  1. 基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt)

    基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt) 昨晚把源代码好好整理了一下,加入了视频时间限制功能.源码放这里,大家随便用. 关于代码的解释可以看我另一篇博客: 基于 FF ...

  2. 基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)

    基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅) 本文参考了雷博士的博客: 最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265)) 还参考了另一篇博客: ...

  3. Qt基于FFmpeg实现视频转码

    一.简述转码 转码的作用:封装格式的实现.(h264->mov.mp4.flv.avi(封装格式)等) 之前博客中提到如何把像素数据编码得到 H264 的压缩码流数据,但是一般的播放工具是没法直 ...

  4. 嵌入式Linux下基于FFmpeg的视频硬件编解码

    嵌入式Linux下基于FFmpeg的视频硬件编解码[图] http://www.c114.net ( 2012/3/1 15:41 ) 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究. ...

  5. android仿微信拍摄视频教程,仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑(上)

    本项目所使用的so库是VCamera,个人免费, 禁止商用,只用作demo演示 因为最近项目做了关于视频拍摄和视频处理的需求, 所以特来分享一下, 做了一个基于微信录制,  分析ffmpeg视频编辑的 ...

  6. android微信视频查看源代码,Android仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑

    功能主要包含5点: 1.基于ffmpeg的视频拍摄及合成; 2.自定义拍摄按钮, 长按放大并且显示拍摄进度; 3.自定义view, 实现手绘涂鸦; 4.自定义可触摸旋转缩放位移的表情文字view; 5 ...

  7. 嵌入式Linux下基于FFmpeg的视频硬件编解码[图]

    转自:http://tech.c114.net/167/a674033.html 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究.结合对S3C6410处理器视频硬件编解码方法的分析,阐 ...

  8. android基于ffmpeg本地视频、在线视频、直播播放器 支持rtmp、rtsp、http等协议

    最近做了一个支持onvif标准的摄像头管理程序,主要就是在局域网中通过程序控制摄像头获取摄像头视频流分发给广域网中的客户端设备:这里面用了onvif协议相关知识和ffmpeg视频流处理的相关知识. o ...

  9. android 基于ffmpeg将视频采集的nv21转h264格式数据

    准备工作 android studio 2.2以上 本项目是基于ndk 开发的项目,使用android studio + cmake进行开发 cmake配置详情可参考: http://www.jian ...

最新文章

  1. html5保存资源本地,html5之Localstorage本地存储
  2. 「镁客早报」人类首次在太空3D打印生物器官;中国学者研制出高性能低成本的电解“水制氢”催化剂...
  3. TWebBrowser 与 MSHTML(2): 获取 window 对象的时机
  4. 对象数组空指针异常说明——C#中使用对象数组必须分别为其开辟空间
  5. C# 学习笔记(13)自己的串口助手
  6. 简谈TCP的八个特性
  7. linux读conf文件格式,CONF 文件扩展名: 它是什么以及如何打开它?
  8. 【二分】Distinct
  9. GridView控件RowDataBound事件中获取列字段值的几种途径
  10. P2P中的NAT穿越方案简介
  11. php explode txt,PHP explode():字符串转数组
  12. 教程:如何迅速制造Vista蓝屏死机?
  13. CentOS 7.6 RPM方式安装Oracle19c的过程
  14. Win8下用DOSBox编写汇编语言
  15. 【渝粤教育】国家开放大学2018年春季 0704-22T民法基础与实务 参考试题
  16. BGP十三条选路原则
  17. 未知环境探索(二)基于边界点的自主环境探索
  18. 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……
  19. python中字典的索引_python字典索引
  20. 怎么将服务器上的文件下载到本地电脑上

热门文章

  1. java队列存储_存储神器——队列
  2. xxxx has no uot-of-line virtual method definitions
  3. 人工智能、ChatGPT等火爆的当下 AI大模型爆发
  4. 外贸邮件推广怎么统计维度
  5. 树莓派pulseaudio出现的问题及解决方法和解决树莓派IOError: [Errno Invalid sample rate] -9997 采样率16K错误
  6. 更好地对待时间的十条建议
  7. 记一次商品数据库设计
  8. vue canvas画多边形
  9. ahk使smark阅读md应用自动最大化及我的常见ahk键盘映射快捷键.
  10. Matlba绘制Logistic函数特殊形式的sigmoid函数图像(含程序)