技术标签: ffmpeg
抽离音频:
ffmpeg -i h264.mp4 -acodec copy -vn audio.aac
-i的意思是input,后接输入源。-codec的意思是直接复制流
使用ffplay播放
ffplay audio.aac
抽离视频:
ffmpeg -i h264.mp4 -vcodec copy -bsf h264_mp4toannexb -f h264 out.h264
说明:
-i h264.mp4 :是输入的MP4文件
-vcodec copy:从MP4封装中进行拷贝
-bsf h264_mp4toannexb:从MP4拷贝到annexB封装
-f h264:采用h.264格式
out.h264:输出的文件名称
播放:
ffplay out.h264
可以使用notepad++ 安装十六进制的插件查看out.h264中的内容https://jingyan.baidu.com/article/ceb9fb100476ebcdac2ba057.html
这些内容的含义在后面解释
抽离h265
ffmpeg -i h265.mp4 -vcodec copy -f hevc out.h265
H.261 用于视频通信,会产生多个国家的互通困难的问题,不同国家采用不同的彩电制式,不可能直接互通。 H.261 采用一种公共中间格式(CIF, Common Intermediate Format),不论何种彩色格式,发送方先把自己国家的彩电制式转换成 CIF 格式,经 H.261 编码后再由CIF 格式转换到接收方彩电制式.
视频信源编码器用于视频信号的码率压缩,主要采用混合编码方法;视频复合编码器将每帧图像数据编排成四层结构,并通过熵编码对视频数据进一步压缩输出。传输缓冲器和码率控制器用于保证输出码流尽可能稳定。传输编码器则用于视频数据的误码检测和纠正。解码器各部分功能与编码器相反。
H.261信源编码器框图如下所示,输入以MB(宏块)为单位
宏块存在的意义:解决帧内压缩。是信源编码器通过算法划分的网格。
H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
以下面这张图为例:
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
划分好宏块后,计算宏块的像素值。
以此类推,计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。
H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。
一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。
宏块越大,视频压缩越高
H.264的宏块,也是编码标准的基本处理单元,通常它的大小也为16x16像素。但在H.264的简介一文中我们就说过,H.264的预测图块可以小到4x4像素。所以这也促成了,16x16像素的宏块,可以接着再划分成子宏块这一操作。
在实际的H.264编码时,可能会使用8x8、或4x8、或8x4、或4x4像素的子宏块,也有可能是它们的组合。
像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。
使用的软件:VideoEye.exe
可以看出大部分宏块大小是16x16,信源编码器的作用就是 划分宏块,H264一般宏块大小16x16,h265的宏块大小最大能到64x64.
使用HEVC analyzer分析h265码流:宏块大小64x64 到 8x8
h264 固定为16x16,h265的宏块称为CTU
视频播放的本质是宏块的运动
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。
为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
为了达到相关帧通过预测的方法来压缩数据,就需要将视频帧进行分组。那么如何判定某些帧关系密切,可以划为一组呢?我们来看一下例子,下面是捕获的一组运动的台球的视频帧,台球从右上角滚到了左下角。
H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。如下图:
通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P B帧,这样编码后的数据帧组我们称为GOP。
一个可以播放的帧的帧类型是I帧,与I帧的差异程度在5%,P帧与I帧的差异程度在30%;
I帧保存了一幅完整的图像,I帧的数量越多,视频越大,I帧间隔越大,视频文件越小;
P帧含有运动矢量和差异信息
在视频编码序列中,GOP即Group of picture(图像组),强相关的一组帧
编码顺序:编码I帧后,向后找到相似程度相差30%的P帧,然后向前编码B帧
所以在码率不变的前提下,GOP值越大,P、B帧的数量会越多,画面细节更多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。
需要说明的是,通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。
同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作(找I帧)的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。
从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。
但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。
一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。还以上面运动的台球视频帧为例,我们来看一下它是如何计算运动矢量的。
H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。下面这幅图就是搜索后的台球移动的位置。
通过上图中台球位置相差,就可以计算出台图运行的方向和距离。H264依次把每一帧中球移动的距离和方向都记录下来就成了下面的样子。
运动矢量计算出来后,将相同部分(也就是绿色部分)减去,就得到了补偿数据。我们最终只需要将补偿数据进行压缩保存,以后在解码时就可以恢复原图了。压缩补偿后的数据只需要记录很少的一点数据。如下所示:
我们把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。下面我们就来介绍一下帧内压缩技术。
运动矢量分析:
问题描述:UUID已经存在 Cannot register the hard disk 'E:\system_iso\CentOS6.8.vdi' {05f096aa-67fc-4191-983d-1ed00fc6cce9} because a hard disk 'E:\system_iso\centos68_02\centos6.8.vdi' with UUID {05f096aa-67fc-4191-983d-1ed00fc6cce9} already exists.错误代码:
spark sql中使用$来引用字段时,需引入import spark.implicits._,否则会报错session读取json文件的时候,默认一行作为一个完整的json解析,若实际的json串行,则会报错:ERROR FileFormatWriter: Aborting job null.org.apache.spark.sql.AnalysisException: Since Spark 2.3, the queries from raw JSON/CSV files are disall._error fileformatwriter: aborting job null.
Ruby版本1、CocoaPods的安装需要Ruby环境,Mac系统都自带Ruby,通过下面终端命令查看Ruby版本:ruby -vCocoaPods支持的Ruby最低版本是2.2.2,如果自己的版本低于2.2.2就需要更新升级Ruby: `sudo gem update --system`更换Ruby镜像Ruby默认的源地址是国外网络地址,通过下面终端命令查看当前镜像地址:gem sources -l~$gem sources -l*** CURRENT SOUR._cocoapods安装
业务代码如下:public PageBean<CompanyDTO> getCompanyList( int pageIndex, int pageSize, CompanyDTO companyDTO) { PageHelper.startPage(pageIndex, pageSize); int counts = this.countCompanyByCond(companyDTO); List<CompanyDTO> comp_pagehelper.startpage 不生效
方法一:import logging# 记录器(笔)log = logging.getLogger('log')log.setLevel(logging.INFO)# 处理器(发送)Handler = logging.StreamHandler()Handler.setLevel(logging.INFO)# 创建日志文件file = logging.FileHandler(filename='1_q.log', encoding="utf-8", mode="a")# 日志格式
根据BRIAN的官网(http://briansimulator.org/)上安装流程,选择推荐的BRIAN2版本。(本机配置,linux 32bit 2G内存) 对Python不太熟悉,按照流程慢慢走,首先安装了Python的集成环境Anaconda,通过Anaconda来安装BRIAN(需要输入想要的安装路径)。 Python 3.5(https://www...._import brain2
2021考研英语黄皮书英一英二全套加解析链接: https://pan.baidu.com/s/1jYuK0d-w__HTYrIOKDm6Zg 提取码: 3khg 复制这段内容后打开百度网盘手机App,操作更方便哦
https://blog.csdn.net/u012923751/article/details/83241169 理解DDRhttps://wenku.baidu.com/view/ac32c8bcf705cc1754270923.html Xilinx平台DDR3设计教程之仿真https://wenku.baidu.com/view/2ffa1334783e0912a316..._aresetn
使用过QDoubleValidator的同学都知道,QDoubleValidator在Qt中实现并不完善,导致使用时存在bug,但是幸好,Qt提供了validate的虚函数,让我们可以重写它,以下是我实现的一个QDoubleValidator版本,暂时没有发现什么问题。//***********************QDoubleValidator.h*************************//#ifndef QTVEDITORDOUBLEVALIDATOR_H#define QTVE_qdoublevalidator
video标签常用属性介绍,下面以vue中使用video标签来举例:1、video标签常用属性 下面shareVideoLink为视频连接地址<!--autoplay=>自动播放 controls=>是否显示控件 loop=>是否循环播放 muted=>是否静音播放 poster=>视频封面 src=>播放源 preload=>页面加..._video标签自动播放的属性
场景使用 JDK12、springboot 2.1.6、springcloudGreenwich 搭建微服务框架的Eureka server,项目编译通过但是启动保报错。项目依赖:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xml..._wehserverexception:unable to start emhedded tomcat
对高级运动系统的初识_ue 什么是als 系统