ffmpeg音视频基础知识

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近楼主在用ffmpeg进行音视频的开发,但对于里面的音视频的基础知识不是很了解,自己上网查找资料进行了总结,方便大家学习


提示:以下是本篇文章正文内容,下面案例可供参考

一、图像的基础知识

我们平常看到的一张张的图片都是有一块一块带有颜色的块组成的。那么这些块我们称之为像素。像我们平时用的电脑,都会有1920*1080的分辨率,也就是说它是由长度1920个像素点,宽度1080的像素点组成的。它的乘机是2073600,相当于电脑屏幕上有两百多万的像素。同时呢,手机(或者显示器)上的屏幕上每英寸面积,像素越多,那么自然的,图片给人的感觉就更清晰,这个就是我们常说的PPI.

二、视频编码基础知识

1.视频和图片之间的关系

视频就是一张一张的图片连起来的画面。衡量它的指标就是我们常说的帧率(Frame Rate)。在视频中,一个帧是一副静止的画面。帧率,是秒的帧的数量,帧率越高,画面越流畅。打游戏时,大家要想玩的爽,肯定帧率要高。

2.为什么要编码?

首先,我们需要了解到的在没有编码之前,我们原始的视频是有多大呢?

以一个分辨率1920*1280,帧率30的视频为例:
共:1920×1280=2,073,600(像素),每个像素点是24bit 也就是:每幅图片2073600×24=49766400 bit,8 bit(位)=1 byte(字节)
所以:49766400bit=6220800byte≈6.22MB。

这是一幅1920×1280图片的原始大小,再乘以帧率30。
每秒视频的大小是186.6MB,每分钟大约是11GB,一部90分钟的电影,约是1000G

这因为如此,我们就要对视频编码,不然的话,一个电脑以2t的硬盘储存空间来算,也存不了几部电影。那你让磁盘里的小姐姐该怎么办呢。。。

3.什么是编码?

编码:就是按指定的方法,将信息从一种形式(格式),转换成另-种形式(格式)。视频编
码:就是将一种视频格式,转换成另一种视频格式。
在这里插入图片描述
我们先来看看,视频从录制到播放的整个过程,如下:在这里插入图片描述
首先是视频采集。通常我们会使用摄像机、摄像头进行视频采集。采集了视频数据之后,就要进行模数转换,将模拟信号变成数字信号。其实现在很多都是摄像机(摄像头)直接输出数字信号。信号输出之后,还要进行预处理,将RGB信号变成YUV信号。

那什么是YUV信号呢?
简单来说,YUV就是另外一种颜色数字化表示方式。视频通信系统之所以要采用YUV,而不是RGB,主要是因为。在YUV这种方式里面,加入了亮度这一概念。在最近十年中,视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度。
所以,工程师认为,在我们的视频存储中,没有必要存储全部颜色信号。我们可以把更多带宽留给黑—白信号(被称作“亮度”),将稍少的带宽留给彩色信号(被称作“色度”)。于是,就有了YUV。


视频相关专业术语

(1)视频:
连续的图象变化每秒超过24帧(Frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的画面叫做视频。

(2)帧(Frame):
是影像中常用的最小单位,相当于电影中胶片的每一格镜头,一帧就是一副静止的画面,连续的帧就形成了视频。
(3)帧速率(FPS):
每秒钟所传输图片的个数,也可以理解为处理器每秒刷新的次数,通常用FPS标识,当然帧数越高,画面也就越流畅。

(4)转码 :
指将一段多媒体包括音频、视频或者其他的内容从一种编码格式转换成为另外一种编码格式。
(原视频 – 解码 – 像素数据 – 编码 – 目标视频)
(原音频 – 解码 – 音频数据 – 编码 – 目标音频)

(5)视频编码:
讲到视频编码,大家可能都会问为什么视频要编码?
— 要知道,采集的原始音视频信号体积都非常大,里面有很多相同的、眼看不到的、耳听不到的内容,比如,如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。

(6)视频解码:
有了编码,当然也需要有解码。
因为压缩(编码)过的内容无法直接使用,使用(观看)时必须解压缩,还原为原始的信号(比如视频中某个点的颜色等),这就是“解码“或者”解压缩“。

(7)采样频率:
指录音设备在一秒钟内对声音信号的采样次数,它用赫兹(Hz)来表示,比如44.1KHz采样率的声音就是要花费44000个数据点来描述1秒钟的声音波形。原则上采样率越高,声音质量越好。

(8)比特率(码率):
表示单位时间(1秒)内传送的比特数,一般我们用的单位是kbps,其英文是 Kilobits per second,意即“千位每秒”(根据发音亦译作“千比特每秒”),意思是说每过一秒钟,有多少千比特的数据流过,因此码率也经常被称为“比特率”。

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

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

相关文章

Linux系统编程(一)

Linux系统编程(一)一、进程和程序二、内存布局内核空间用户空间三、进程状态四、环境变量五、进程共享一、进程和程序 程序:是指编译好的二进制文件,存储在磁盘中,不占用系统资源。 进程:是系统进行资源分…

Linux的SOCKET编程 简单演示

转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作&a…

Unity(一)必然事件

【MonoBehaviour 类】(一)必然事件一、必然事件是什么?二、常用函数执行顺序1.Awake2.Start3.update4.FixedUpdate三、Awake和start区别一、必然事件是什么? 在Unity中必然事件也称脚本生命周期,是指在Unity脚本在唤醒…

Linux系统编程(二)孤儿进程和僵尸进程

Linux系统编程(二)一、exec函数族1.exec函数二、孤儿进程和僵尸进程三、wait和waitpid1.wait函数2.waitpid函数一、exec函数族 exec函数使用时,改程序的用户空间的代码和数据会被新程序给替代,会从新程序的启动例程开始。调用exe…

linux下c/c++实例之十socket简单应用

转自:http://blog.csdn.net/taiyang1987912/article/details/49738351 一、简介 通过socket扫描本机打开的tcp端口号,模拟用户名、密码登录服务器的过程、socket文件传输及模仿http服务器。 二、详解 1、Linux下tcp端口扫描 (1)…

Linux系统编程(三)进程间的通信

Linux系统编程(三)进程间的通信一、为什么需要进程之间的通信(IPC)?二、管道1.概念2.特质3.原理4.局限性5.代码2.读入数据三、共享存储映射注意事项父子进程通信一、为什么需要进程之间的通信(IPC&#xff…

exec 函数族

转自:http://www.cnblogs.com/mickole/p/3187409.html linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用 本节目标: exec替换进程映像exec关联函数组(execl、execl…

Linux系统编程(四)信号

Linux系统编程(四)信号一、什么是信号?1、信号的本质2、信号来源硬件来源软件来源二、常见信号1.可靠信号和不可靠信号2、不可靠信号主要有以下问题:3、可靠信号与不可靠信号注册机制三、信号处理方式四、信号处理过程五、未决信号和阻塞信号…

SIGCHLD信号回收子进程

SIGCHLD信号回收子进程代码问题注意点代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

转自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系统编程之进程&#xff08;六&#xff09;&#xff1a;父进程查询子进程的退出,wait,waitpid 本节目标&#xff1a; 僵进程SIGCHLDwaitwaitpid 一&#xff0c;僵尸进程 当一个子进程先于父进程结束运行时…

Linux C++ 简单爬虫

转载&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;传入URL&#xff0c;返回对应页面的内容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系统编程(七)消息队列

Linux系统编程&#xff08;七&#xff09;消息队列一、什么是消息队列二、消息队列内部原理三、实现消息队列的收发1.发送消息队列2.接收消息队列四、消息队列与命名管道的比较一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都…

基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序

转自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所谓半双工通信&#xff0c;即通信双方都可以实现接发数据&#xff0c;但是有一个限制&#xff1a;只能一方发一方收&#xff0c;之后交换收发对…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

Linux socket编程,对套接字进行封装

转自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系统编程(九)线程同步

Linux系统编程&#xff08;九&#xff09;线程同步一、什么是线程同步&#xff1f;二、互斥量三、条件变量pthread_cond_wait函数pthread_cond_signal函数生产者和消费者模型一、什么是线程同步&#xff1f; 线程同步&#xff0c;指一个线程发出某一功能调用时&#xff0c;在没…

linux网络编程(一)网络基础传输知识

linux网络编程&#xff08;一&#xff09;网络传输基础知识一、什么是协议&#xff1f;二、使用步骤典型协议2.网络应用程序设计模式C/S模式B/S模式优缺点3.分层模型4.TCP/IP四层模型通信过程5.协议格式数据包封装以太网帧格式ARP数据报格式IP段格式UDP数据报格式TCP数据报格式…

Linux 进程学习(四)------ sigaction 函数

转自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数&#xff1a; signal 函数的使用方法简单&#xff0c;但并不属于 POSIX 标准&#xff0c;在各类 UNIX 平台上的实现不尽相同&#xff0c;因此其用途受 到了一定的限制…

linux网络编程(二)高并发服务器

linux网络编程&#xff08;二&#xff09;高并发服务器错误处理高并发服务器多进程并发服务器客户端错误处理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…

linux知识(一) 程序、进程与线程

linux知识&#xff08;一&#xff09; 程序、进程与线程程序进程程序如何变成进程&#xff1f;线程线程与进程fork和创建新线程的区别优点程序 程序&#xff1a;程序是已编译好的二进制文件&#xff0c;存储在磁盘中&#xff0c;不占用系统资源 程序包括&#xff1a; RO段&am…