Android FFmage 修改视频分辨率,帧率,区域裁剪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android FFmage 修改视频分辨率,帧率,区域裁剪相关的知识,希望对你有一定的参考价值。

参考技术A String ffmpeg ="-y -i " +filePath +" -strict -2 -vcodec libx264 -preset ultrafast -crf 24 -acodec aac -ar 44100 -ac 2 -b:a 96k -s " + (int)(videoWidth /bili) +"x" + (int)(videoHeight /bili) +" -aspect 5:3 "+savePath;

filePath  = 原视频地址  

(int)(videoWidth /bili) +"x" + (int)(videoHeight /bili)  = 分辨率(1080 * 1920)

5:3 = 分辨率比例

savePath = 保存地址

详细参数参考 = https://blog.csdn.net/a11544/article/details/58156521?fps=1&locationNum=3

"ffmpeg -i " + filePath +" -r 25 -strict -2 -vcodec libx264 -preset ultrafast -acodec aac -ar 44100 -ac 2 -b:a 96k " +frameFilePath;

25 = 帧率

String ffmpeg = "ffmpeg -i " + filePath + " -strict -2 -vf crop=" + (int)(videoWidth / bili) + ":" + (int)(videoHeight / bili) + ":0:0 -preset fast " + savePath;

(int)(videoWidth / bili) + ":" + (int)(videoHeight / bili) = 裁剪的尺寸,分辨率

:0:0 = 从什么位置开始裁剪  x y    不输入从0.0开始

String[] commands = ffmpeg.split(" ");

RxFFmpegInvoke.getInstance().runCommandRxJava(commands).subscribe(new RxFFmpegSubscriber()

@Override

 public void onFinish()

Log.i(TAG,"onFinish: ");



@Override

            public void onProgress(int progress,long progressTime)

Log.i(TAG,"onProgress: ");



@Override

            public void onCancel()

Log.i(TAG,"onCancel: ");



@Override

            public void onError(String message)

Log.i(TAG,"onError: "+message);



);

需要先导入FFmpge项目   github上一大堆。

文档用于记录ffmpge使用方法,因本人初次使用,指令意思都不了解,方法找了很久才找到。

以上功能已经再项目中使用

视频分辨率、帧率、码率

参考技术A

视频分辨率分为:

可以理解成: 视频分辨率决定了视频容器的大小。
比如一个720p的视频,如果用手机看,因为手机屏幕小,它看起来很清晰。如果电视看,可能就不是很清晰了。这就跟一张图片,你越把他放大,看起来越模糊是一个道理。
分辨率不能决定视频清晰度,需要与码率相结合

视频是由一张张的图片形成的,我们看起来很流畅是因为人眼有视觉停留的现象,当图片以24张每秒的速度匀速播放时,这些图片看起来就是连续的。
所以视频的帧率决定了视频的流畅程度。

无压缩情况下码率的计算公式:

比如,分辨率为 1920 x 1080、位深为 8 bits、帧率 25 的视频,无压缩状态下的码率应为 1186 mbps,约 1.1 gbps。
(1gbps = 1024mbps = 1024 x 1024 kbps)
(1920 × 1080) × (8 × 3) × 25 ÷ 1024 ÷ 1024 = 1186mbps = 1.16gbps
此时1s时长的视频大小为:1.16 x 1 ÷ 8 = 0.145g = 148m。视频大小计算方式参考下面公式。

视频在采集后都需要进行压缩,如果不压缩,实在是太大了,此时就需要根据分辨率、帧率、码率做个平衡。
码率决定了单位时间内的视频大小。单位是bps(bit per second,位每秒),一般使用 kbps(千位每秒)或Mbps(百万位每秒)。
注意:是按位(bit)算的。
复习下单位换算:
一个字节(byte)等于8位(bit),1kb等于1024个字节(byte),1m等于1024kb。

视频大小的简单计算方式为:
【视频文件大小】 (kb) = 【码率】(kbps) x 【时间】(s)÷ 8
例如:
一个10s的视频,码率为15mbps(1mbps = 1024kbps),则它的视频文件大小为(忽略音频):
视频文件大小 = 15 x 1024 x 10 ÷ 8 = 19200kb = 18.75MB

在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。

在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。

以上是关于Android FFmage 修改视频分辨率,帧率,区域裁剪的主要内容,如果未能解决你的问题,请参考以下文章

码率、帧率是啥?解析视频码率、帧率、分辨率的关系

I帧,P帧,B帧,视频码率,帧率和分辨率 区别和理解

怎样根据视频码率/音频码率/分辨率/时间长度/视频压缩格式/帧率,计算视频文件的大小?

stm32 播放高帧率高分辨率视频和照片详细制作过程(播放Bad Apple为例)

[FFMPEG-CLI]合并不同分辨率/帧率视频注意事项-出现合并后时长问题

视频基本概念