【ffmpeg-libav-tutorial】介绍——视频、音频、编码器、容器、使用方法

介绍

视频——你所看到的

如果你有一序列的图片,并且以一个给定的频率来改变他们出现的时间(比如24张图片每秒),那么你就能看到一个运动的感觉。换句话来说,视频的基本思想就是:以一定的速率改变一系列图片的出现。
在这里插入图片描述

音频

虽然静音视频已经能够表达各种各样的感受,但是往视频里添加声音会带来更多的乐趣与体验。
在数字音频系统中,麦克风将声音转换为模拟信号,然后进行模数转换,通常是通过脉冲编码调制将模拟信号转换为数字信号
在这里插入图片描述

编码器——数据压缩

codec是利用电路或者软件对声音或者视频进行压缩解压缩的工具。它包括编码和解码两个部分。如果我们将一张张的图片组合成的电影直接存起来的话,将会获得一个巨大的文件。举个例子来说:
假设我们正在创建一个分辨率为1080 x 1920(高x宽)的视频,并且我们将每像素花费3个字节(屏幕上的最小点)来编码颜色(或24位颜色,这给我们带来了16,777,216 不同的颜色),这个视频以每秒24帧的速度运行,长度为30分钟。

toppf = 1080 * 1920 // total_of_pixels_per_frame
cpp = 3 // cost_per_pixel
tis = 30 * 60 // time_in_seconds
fps = 24 // frames_per_second
required_storage = tis * fps * toppf * cpp

那么这个视频大概需要250.28GB的存储空间或者1.11Gbps的带宽!这就是我们需要codec的原因。

容器

一个容器或者封装格式指的是一种元文件格式,它能够用来描述不同的数据和元数据(metadata)如何在一个计算机文件中共存。

单个文件包含了所有的流(通常是视频、音频流),它还提供同步数据以及一些常规元数据,比如标题、分辨率等。

通常我们可以通过文件的扩展名来判断一个文件的格式,比如,video.mp4可能就是使用容器mp4进行封装的视频。
在这里插入图片描述

FFmpeg-命令行

ffmpeg是一种完整的跨平台解决方案,能够用来录制、转换、流式传输视频和音频数据。为了使用多媒体,我们使用一个ffmpeg来完成这些工作。你可能直接或者间接的使用过这个工具了(比如 你如果用过chrome的话)

ffmpeg是一个简单而强大的程序。比如当你需要从mp4转化到avi格式时,就能够直接使用以下这个命令:

ffmpeg -i input.mp4 output.avi

通过以上这个命令就能实现从mp4封装到avi封装的转换。从技术上来讲,ffmpeg也可以进行转码,以后我们也会慢慢讲到。

FFmpeg命令行工具

ffmpeg官网有个文档详细介绍了他的用法
简单来说,FFmpeg命令行需要按照以下的格式来执行

ffmpeg {1} {2} -i {3} {4} {5}

其中
1、全局选项
2、输入文件选项
3、输入文件
4、输出文件选项
5、输出文件
2、3、4都是可选的。下面通过一个示例来简单介绍一下

#下载一个视频作为输入文件
wget -O bunny_1080p_60fps.mp4 http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4
ffmpeg \
-y \ # 全局选项
-c:a libfdk_aac -c:v libx264 \ # 输入文件选项
-i bunny_1080p_60fps.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件选项
bunny_1080p_60fps_vp9.webm # 输出文件

这个命令使用的mp4文件包含了两路流(aac编码的音频流和h264编码的视频流),将其转化为webm格式,并采用对用音频视频编码方式。
我们可以简化以上的命令,值得注意的是ffmpeg能够采用或者针对视频猜测默认值。比如上一个一开始的命令ffmpeg就能猜测具体音视频codec。
这里有份 tutorial about encoding and editing with FFmpeg.

视频常用操作

转码

在这里插入图片描述
定义:将一种codec的音视频流转化到另一种codec
用途:一些设备不支持某个codec但是它却有更高的压缩率,因此可以利用ffmpeg进行转码。
用法:比如将H264(AVC)转换到H265(HEVC)

ffmpeg	\
-i bunny_1080p_60fps.mp4 \
-c:v libx265	\
bunny_1080p_60fps_h265.mp4

转封装

在这里插入图片描述
定义:从一个封装格式转换到另一种封装格式
用途:一些设备不支持某些格式,而这些格式具有与时俱进的功能
用法:将mp4格式装换到webm

 ffmpeg \
-i bunny_1080p_60fps.mp4 \
-c copy \ ##codec一致可直接拷贝
bunny_1080p_60fps.webm

转码率

定义:改变比特率或者产生其他表现形式
用途:不同的带宽,需要提供不同码率的视频流才不会造成卡顿。
比如:将文件转换到3856k到2000k之间的码率

ffmpeg \
-i bunny_1080p_60fps.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
bunny_1080p_60fps_transrating_964_3856.mp4

通常情况下,转码率与转大小将一起配合使用。

转分辨率

在这里插入图片描述
定义:从一个分辨率转换到另一种分辨率
用途:同传码率
用法:如从1080p转换到480p

ffmpeg \
-i bunny_1080p_60fps.mp4 \
-vf scale=480:-1 \
bunny_1080p_60fps_transsizing_480.mp4

自适应

在这里插入图片描述
定义:产生许多分辨率(比特率),并将它们分成chunk,并通过http提供服务
用途:为了提供可以在低端智能手机或4K电视上观看的灵活媒体,它也易于扩展和部署,但它可以增加延迟。
用法:使用DASH创建自适应WebM

ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 -an -f webm -dash 1 video_160x90_250k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 320x180 -b:v 500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_320x180_500k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 750k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_750k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 1000k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_1000k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 1280x720 -b:v 1500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_1280x720_1500k.webm

# audio streams
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm

# the DASH manifest
ffmpeg \
 -f webm_dash_manifest -i video_160x90_250k.webm \
 -f webm_dash_manifest -i video_320x180_500k.webm \
 -f webm_dash_manifest -i video_640x360_750k.webm \
 -f webm_dash_manifest -i video_640x360_1000k.webm \
 -f webm_dash_manifest -i video_1280x720_500k.webm \
 -f webm_dash_manifest -i audio_128k.webm \
 -c copy -map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \
 -f webm_dash_manifest \
 -adaptation_sets "id=0,streams=0,1,2,3,4 id=1,streams=5" \
 manifest.mpd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值