ffmpeg——关于视频压缩
这篇博客主要讲有关于视频压缩的问题,解决视频文件太大,不便于下载,占用存储空间过大等问题,在缩小视频大小的同时,保证视频的观看质量。主要讲以下几点:
1、压缩视频工具ffmpeg
2、压缩视频的技术参数
3、视频如何压缩
一、压缩视频工具ffmpeg
下载ffmpeg链接:https://ffmpeg.zeranoe.com/builds/;
安装步骤一: 可以根据你的电脑选择64位或者32位,下载下来的是个压缩文件,用解压文件解压就可以了,我是安装在C盘,如图:
步骤二:配置环境,右击“我的电脑”----->属性,然后如图所示:
步骤三:在cmd下,查看是否安装成功
二、压缩视频的技术参数
1、我们先来了解下压缩视频参数(查看这些压缩视频参数,可以用mediainfo软件打开视频文件,就可以看到各种参数如截图所示,以视频3.mp4为例):
2、在上述截图中可以看到3.mp4视频音频部分的位深度没有显示,这里我用软件Adobe Audition打开3.mp4视频,可以看到音频部分的位深度是16bit
2、技术参数解释
视频尺寸:指的就是视频的分辨率,常见的分辨率有4096*2304,1920*1080,720*576等。
视频编码:视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式。视频编码格式常见到的有:MPEG-2 TS、Divx、Xvid、H.264、WMV-HD和VC-1。
音频编码:音频编码方式指通过特定的压缩技术对音频数据进行处理的方法。
帧率:帧率(即视频更新率)是用于测量显示帧数的量度。测量单位为“每秒显示帧数”(Frame Per Second,FPS,帧率)或“赫兹”,单位用FPS用来描述视频每秒播放多少帧,而单位用赫兹用来描述显示器的画面每秒更新多少次。 一般帧率越高,视频画面越流畅。
比特率:指每秒传送的比特(bit)数,即每秒传输的文件大小。比特率规定使用“比特每秒”(bit/s 或 bps)为单位。比特率越高,每秒传送的数据越大。
采样率:采样率的单位是Hz,表示每秒采样的次数。单位时间内取样率越大,精度就越高,处理过的视频文件就越接近没有处理过的视频文件。
码率:码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。码率与体积成正比:码率越大,体积越大;码率越小,体积越小。由于文件体积与取样率是成正比的,所以几乎所有的编码格式都想用最低的码率达到最少的失真,“码率”就是失真度,码率越高越清晰,反之则画面粗糙而且马赛克多。
视频部分的位深度:用于指定图像中的每个像素可以使用的颜色信息数量,用“位即bit”为单位。
音频部分的位深度:单个声道的采样数据大小
Audio部分声道:指声音在录制或着播放的时候在不同空间位置采集或回放的相互独立的音频信号,所以声道数量也就是声音录制时的音源数量或回放时相应的扬声器数量。
(1)关于Audio部分码率的计算公式:
码率(位/秒)=采样率(HZ)* 采样位深度(bit)* 声道数量
论证"码率(位/秒)=采样率(HZ)* 采样位深度(bit)* 声道数量"公式的正确性:
1)量纲分析来看:
HZ * bit=bit/s,验证公式不是错的
2)从理论上看:
码率是每秒传输的信息大小;
采样率是每秒采样的次数;采样位深度是单个声道的每次采样数据大小;
(采样率*位深度)指的就是音频部分单个声道每秒传输的数据大小;
然后两个声道传输的信息大小=单个声道传输的数据大小 * 声道数 ;
由此得出:Audio部分码率=采样率(HZ)* 采样位深度(bit)* 声道数量。
3)以一个未被压缩的音频文件为例,验证公式是否正确。
Audio部分码率码率=采样率* 采样位深度* 声道数量=44.1KHZ * 16bit * 32= 1411.2 Kbps,与图中码率结果相符合,验证公式正确 。
(2)Video部分码率的计算公式
码率(位/秒)= 屏幕显示分辨率(无单位) * 彩色位数(位)* 帧率(帧数/秒等同于HZ)
1)量纲分析来看:
位/秒 = 位 * HZ ,验证公式不是错的。
2)从理论上看:
帧是指视频中的图像;
帧率是指每秒显示的图像数;
视频部分的位深度是用于指定图像中的每个像素可以使用的颜色信息数量;
一张图像的像素总数等于画面宽度像素数乘以画面高度像素数的乘积;
像素是图像信息大小的最小单位;
所以,一张图片的信息大小=屏幕显示分辨率(画面宽度像素数*画面高度像素数)* 位深度;每秒显示的图像信息量大小即码=一张图片的信息大小 * 帧率。从而验证了公式“Video部分码率= 屏幕显示分辨率 * 彩色位数* 帧率”是正确的。
(3)关于视频大小的计算公式:
Audio部分文件大小=Audio部分码率* 视频播放的总时间
Video部分文件大小=Video部分码率* 视频播放的总时间
整个视频 文件大小=(Audio部分码率+Video部分码率)* 视频播放的总时间
(注意:上述(1)(2)公式适用于不被压缩的视频文件。(3)公式都适用未被压缩和压缩过的视频文件)
三、视频如何压缩
1、对于压缩.mp4视频体积,压缩以后视频的效果:在不改变视频尺寸(分辨率不变)、视频和音频编码不变(视频格式不变,所以这两个编码不变)、帧率不变(保证画面连贯度,所以帧率不变)的情况下,通过改变比特率,使得视频文件体积变小,不影响画面和声音质量,保证眼睛和耳朵感受不到很大差别。
3、如何设置参数呢?
一般, 在压缩视频的时候,帧率参数都不改变,原视频帧率是多少就是多少。码率影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。
如何设置压缩的比特率呢?
压缩视频的音频部分的码率和视频部分的码率大小相比较来说,音频部分的码率可以忽略不计,所以视频的比特率数值可以等同于视频部分的码率数值。让视频无卡顿的播放,设置的比特率要高于文件的读入速度,此处以我的联想电脑F盘为例,下载一个Parkdale软件测试F盘test.mp4读入速度,如图所示:
4、设计实验计算:以视频源test.mp4为例,设置的比特率高于(磁盘读写速度平均值*8约等于500K,单位kbps),这里设置比特率数值为600K
1、压缩的ffmpeg命令
参数解释:
-i 输入文件,后面跟的是文件的地址,如果test.mp4文件路径和ffmpeg是在同一根目录下,则直接输入-i test.mp4。
-b 数据比特率,每秒传输的数据流量大小(kb/s),这个命令里设置的比特率是600k,用于指定视频的压缩程度,后面跟的是压缩原视频后的视频存储路径。
2、原视频和压缩后视频参数,截图如下:
1是视频体积大小,2是视频的比特率,3是视频的尺寸,4是帧率,从这两个图中我们可以看到视频压缩的参数比特率发生了变化,视频体积变小了,压缩后的视频体积由码率可以算出:约等于(时间*码率/8=49*600/8=3.58MB),与实际压缩后视频大小有一定的误差,因为audio的比特率忽略不计了。压缩后的视频比原视频肯定有点区别,不过不影响观看质量。
ffmpeg——关于视频压缩的更多相关文章
- mac ffmpeg mediainfo视频压缩
最近在开发官网,官网上放了一些视频,但是本宝宝拿到的都是100多.200多.300多兆的原视频,怎么把他们变成统统20兆呢?宝宝用了如下方法,很好用哟- 1.安装视频压缩工具下载ffmpeg brew ...
- ffmpeg for iOS
链接: ios ffmpeg 实时视频压缩(主要是H264) 最简单的基于FFmpeg的移动端例子:IOS 视频转码器 iOS下使用FFMPEG的一些总结 iOS配置FFmpeg框架 iOS上使用高大 ...
- 利用FFmpge进行视频压缩(从图像到H264视频流)
对于FFmpeg相信做视频或图像处理这一块的都不会陌生,在网上也能找到非常多相关的代码.但因为版本号不同等原因.往往找到的代码都是须要自行改动才干够用,为此本人希望能尽绵薄之力,将开发包和自行编写的代 ...
- Android 音视频深入 二十 FFmpeg视频压缩(附源码下载)
项目源码https://github.com/979451341/FFmpegCompress 这个视频压缩是通过类似在mac终端上输入FFmpeg命令来完成,意思是我们需要在Android上达到能够 ...
- H5外包团队 android视频压缩,使用ffmpeg方案
android视频压缩,使用ffmpeg方案,集成fdk-aac与264编码,适用于32位系统与64位系统,支持ARM 32/64 cpu与x86 32/64 cpu,mips 32/64 cpu,即 ...
- ffmpeg视频压缩与分割
ffmpeg -i .mov -vcodec libx264 -crf out.mp4 --分辨率不动进行压缩 ffmpeg -i .mp4 -c copy -c:v libx264 -vf scal ...
- javacv FFmpeg 视频压缩
package com.nmcc.demo.utils; import lombok.extern.slf4j.Slf4j; import org.bytedeco.javacpp.avcodec; ...
- h5视频上传之前端视频压缩研究
今天领导接到一个h5上传手机视频的需求,主要是要看用户在这个视频中有没有完成某个任务,比如投篮进了几个球. 但是由于手机拍摄的视频文件大小有点大,直接上传的话,用户流量顶不住,而且特别耗时,在这样的情 ...
- 基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)
===================================================== 基于最简单的FFmpeg封装工艺的系列文章上市: 最简单的基于FFmpeg的封装格式处理:视 ...
随机推荐
- codeforces 348D Turtles
codeforces 348D Turtles 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first ...
- NutzWk 5.0.x 微服务分布式版本开发及部署说明
NutzWk 5.x 已发布一段时间,这段时间基于此版本开发了智慧水务系统(NB-IOT).某物联网平台.某设备租赁平台.某智慧睡眠平台.某智慧园区项目等,开发和部署过程中遇到一些小问题,开这个帖子把 ...
- oracle删除用户及其表空间
oracle删除用户及其表空间 删除表空间:可以先将其offlinealter tablespace xx offline;将磁盘上的数据文件一同删除drop tablespace xxx inclu ...
- glusterfs分布式文件系统
第一:安装依赖包: yum install libibverbs librdmacm xfsprogs nfs-utils rpcbind libaio liblvm2app lvm2-devel ...
- Jsp实现在线作业提交系统
Jsp实现在线作业提交系统 作为 Computer Science 的学生,凌晨四点之前睡都应该感到羞耻. 项目托管地址:https://github.com/four-in-the-morning/ ...
- virtualbox+vagrant学习-2(command cli)-18-vagrant ssh-config命令
SSH Config 格式: vagrant ssh-config [options] [name|id] 这将从SSH直接将SSH配置文件的有效配置输出到正在运行的vagrant 计算机(而不是使用 ...
- 一个简单好用的http服务器
http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...
- Linux虚拟机下安装Oracle 11G教程
1.安装环境 操作系统:Red hat 6.5 内存:内存最低要求256M (使用:grep MemTotal /proc/meminfo 命令查看) 交换空间:SWAP交换空间大小根据内存大小决定( ...
- redis缓存穿透和缓存失效的预防和解决
缓存穿透: 认识 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透. 解决办法: 对所 ...
- Python的open函数文件读写线程不安全,logging模型文件读写线程安全!
工作中遇到的问题:如何在多线程的程序中同时记录日志? 最初图省事,使用了最原始的open函数来写日志,因为开始使用的写文件模式的是追加('a'),发现并没有线程不安全的现象,各个线程的的日志信息都写入 ...