音视频开发之旅(三) -----ffmpeg功能和相关命令
前言
说到ffmpeg,在我一开始还未接触到音视频相关知识的时候,只是觉得这个是一个操作音视频的,但是不知道具体是操作音视频哪些细节(比如解码啊、转码啊等等),在上半段文中,主要介绍ffmepg的相关命令,让大家体会一下ffmpeg的强大功能,在后文中,会尝试如何在android中调用ffmpeg的一些简单方法。这一章涉及到的音视频基础概念,比如码率、帧率等不再做重复解释了,大家对某些概念有遗忘的可以返回 音视频开发之旅(一)
在第一篇我们的源码里,有一个ffmpeg执行文件,我们cd到当前目录下做相关的操作
1.FFmpeg 常用命令
1.1 改变帧率、码率和文件大小
改变帧率
./ffmpeg -i test.mp4 -r 30 output.mp4
码率(也叫作比特率或数据速率)是一个决定整体音频或视频质量的参数。它指定每个时间单位处理的比特数。
码率决定使用多少位存储1s内编码的流数据,它是用-b选项设置区分音频流和视频流的,推荐使用 -b:a或-b:v
码率最直观的表现就是视频内存大小的变化
./ffmpeg -i test.mp4 -b 1.5M malv.mp4
执行命令前
执行命令后
下面介绍文件的大小的计算方式
编码输出的最终文件大小是音频流和视频流文件大小的总和。视频流文件大小的计算方式如下:
video_size =video_bitrate * time_in_seconds/8 (以btye为单位)
如果音频没有压缩,音频大小计算方式为
数据量=(采样频率×采样位数×声道数×时间)/8
如果音频有压缩,音频大小计算方式为
数据量=(码率×时间)/8
1.2 调整视频分辨率
主要改变视频的宽和高
./ffmpeg -i test.mp4 -s 640&480 out_put.mp4
1.3 裁剪/填充视频
要裁剪视频,就意味着要选择好矩形区域,裁剪后只有矩形区域,没有其他部分。裁剪通常用于调整大小、填充和其他编辑操作。
./ffmpeg -i ./origin/test.mp4 -vf crop=iw/3:ih:0:0 crop1.mp4
裁剪前:
裁剪后:
裁剪中间一半
./ffmpeg -i ./origin/test.mp4 -vf crop=iw/2:ih/2 output_crop2.mp4
下面是填充的内容
图片色彩填充:
./ffmpeg -i origin/test_pic.jpg -vf pad=860:660:30:30:red output_lufei.jpg
将4:3的视频填充到16:9
./ffmpeg -i input -vf pad =ih*16/9:ih:(ow-iw)/2:0:color output
同理,也能将16:9的视频转化成4:3的视频,只需要保持宽度不变,高=宽*3/4
./ffmpeg -i input -vf pad =iw:iw*3/4:0:(oh-ih)/2:color output
当不知道文件确切的分辨率的时候
./ffmpeg -i input -vf pad =iw:iw*3/4:0:(oh-ih)/2 output
1.4 旋转视频
逆时针方向旋转90度
./ffmpeg -i input -vf transpose =0 output
旋转使用参数 transpose
1.5 模糊和锐化视频
输入视频一般包含各种噪声,可以通过一些去噪算法来提升视频的质量。在视频被编码前,去噪是视频预处理的一部分。
模糊效果用于提高图像(视频帧)某些类型的质量,其中每个输出像素值都是从相邻的像素值计算出来的。
模糊
. /ffmpeg -i input -vf boxblur=1:2 output.mp4
锐化
./ffmpeg -i input -vf unsharp=6:6:-2 output.mp4
1.6 画中画
视频叠加通常用于在背景视频或图像上显示前景视频或图像。视频浮层叠加命令如下
./ffmpeg -i origin/test.mp4 -i origin/test_pic.jpg -filter_complex overlay outputview.mp4
也可以延迟出现图片
./ffmpeg -i origin/test.mp4 -itsoffset 5 -i origin/test_pic.jpg -filter_complex overlay outputdelayview.mp4
1.7 文件格式转化
FFmpeg工具经常与音频或视频格式的转换有关。另外,format参数是在输出文件之前由 -f选项设置的。
FFmpeg可以对输入的文件流进行文件格式的转换,比如只修改输入文件某些文件信息,就可以让输出文件的媒体格式保持和原来一样。输入文件的数据包在编码时进行压缩或不压缩,视频压缩包括使用特定的编解码器。
文件格式转化过程可以分为如下几个步骤
- 1.解复用过程(demuxing):将编码好的数据,通过FFmpeg的libavfomat库和解复用器进行解复用,分离出原始音频和视频数据
- 2.解码过程(decoding):将解复用后的音频和视频数据包(AVPacket),通过相匹配的解码解码成未压缩的视频帧(AVFrame),如果FFmpeg命令中有-c copy选项,则表示没有解码(decoding)
- 3.编码过程(encoding): 编码器可以把未压缩的帧(AVFrame)解码成原始数据包(AVPacket)
- 4.复用过程(muxing): 通过复用器将原始数据包(AVPacket)合成指定的封装格式。
后记
接下来会涉及到ffmpeg的源码以及在Adnroid中是如何运用了,从实战角度去熟悉ffmpeg
参考《Android音视频开发》