参考自:
https://androidlearnersite.wordpress.com/2017/03/17/ffmpeg-video-editor/
【主要是为了学习相关ffmpeg命令~~~】

前言

FFmpeg是可用于编辑或转换视频和音频的工具。它包括libavcodec –音频/视频编解码器库。
FFmpeg的一些用途是:

  • Video Compress —— 视频压缩
  • Audio Compress —— 音频压缩
  • Video Cut ——视频剪辑
  • Video Rotate ——视频旋转
  • Video Crop——视频裁剪
  • Extract Picture from Video ——从视频中提取图片
  • Extract Sound from Video ——从视频中提取声音
  • Change Video Resolution ——更改视频分辨率
  • Adding filters to videos ——向视频添加过滤器
  • Creating fast and slow motion video ——制作慢动作和慢动作视频
  • Reverse Video ——倒转影片
  • Creating video from images ——从图像创建视频
  • Convert video from one format into another ——将视频从一种格式转换为另一种格式
  • Merge an audio and video——合并音频和视频

为了将FFmpeg集成到android中,我们可以使用预编译的库,例如ffmpeg-android。
ffmpeg-android是WritingMinds编写的库,它简化了在Android项目中使用ffmpeg的任务。

下面的帖子介绍了如何使用FFmpeg-集成以下功能

  • 视频压缩
  • 视频剪辑
  • 从视频中提取图片
  • 从视频中提取音频
  • 为视频添加淡入淡出效果
  • 创建快速运动视频
  • 创建慢动作视频
  • 倒转影片
    除了这些以下功能外,注释部分还讨论了以下内容:

合并音频和视频,以覆盖视频的音频(如果有)

  1. 将音频作为背景音乐添加到视频中,以保持视频的音频
  2. 将视频速度提高3倍,4倍
  3. 从图像创建视频
  4. 分割影片
  5. 添加水印
  6. 将音频与另一个音频连接
  7. 将视频与另一个视频连接
  8. 在不同的时间向视频添加两个水印
  9. 使用URL作为输入选项

我使用RangeSeekBar允许用户从原始视频中选择剪切视频的时间范围。

帖子的完整代码上传到github上的以下链接-

https://github.com/bhuvnesh123/FFmpeg-Video-Editor-Android

并在Play商店上发布了扩展应用-

https://play.google.com/store/apps/details?id=videoeditor.bhuvnesh.com.ffmpegvideoeditor

集成FFmpeg库
1、在应用程序模块gradle文件中添加FFmpeg依赖关系并同步项目。

compile ‘com.writingminds:FFmpegAndroid:0.3.2’

2、使用以下代码加载FFMpeg-

FFmpeg ffmpeg;
private void loadFFMpegBinary() {try {if (ffmpeg == null) {Log.d(TAG, “ffmpeg : null”);
ffmpeg = FFmpeg.getInstance(this);
}
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {@Override
public void onFailure() {showUnsupportedExceptionDialog();
}@Override
public void onSuccess() {Log.d(TAG, “ffmpeg : correct Loaded”);
}
});
} catch (FFmpegNotSupportedException e) {showUnsupportedExceptionDialog();
} catch (Exception e) {Log.d(TAG, “EXception not supported : ” + e);
}
}

loadBinary根据设备的架构将ffmpeg二进制文件复制到设备。 每当您启动应用程序或第一次使用FFmpeg时,只需在代码中放置一次即可。

3、创建一个将ffmpeg命令作为参数的方法,并将其传递给FFMpeg类的方法。

private void execFFmpegBinary(final String[] command) {try {ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {@Override
public void onFailure(String s) {Log.d(TAG, “FAILED with output : ” + s);
}@Override
public void onSuccess(String s) {Log.d(TAG, “SUCCESS with output : ” + s);
//Perform action on success
}
}@Override
public void onProgress(String s) {Log.d(TAG, “progress : ” + s);
}@Override
public void onStart() {Log.d(TAG, “Started command : ffmpeg ” + command);
}@Override
public void onFinish() {Log.d(TAG, “Finished command : ffmpeg ” + command);}
});
} catch (FFmpegCommandAlreadyRunningException e) {}
}

FFmpeg类的execute()方法以命令为参数并执行该命令。它具有ResponseHandler,在启动,进行,完成,成功和失败时返回事件。

现在,我们将介绍各种FFmpeg命令,这些命令可用于执行不同的操作-

Compress a video

要压缩视频,我们可以使用以下命令-

String[] command = {"-y", "-i", inputFileAbsolutePath, "-s", "160x120", "-r", "25", "-vcodec", "mpeg4", "-b:v", "150k", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputFileAbsolutePath};
-y
Overwrite output files without asking.
-i
ffmpeg reads from an arbitrary number of input “files” specified by the -i option
-s
video output size
-r
Set frame rate
-vcodec
Set the video codec.
-b:v
Set the video bitrate
-b:a
Set the audio bitrate
-ac
Set the number of audio channels.
-ar
sets the sampling rate for audio streams if encoded

Cut a video

要剪切视频并重新编码,我们可以使用以下命令

String[] complexCommand = {"-ss", "" + startMs / 1000, "-y", "-i", inputFileAbsolutePath, "-t", "" + (endMs - startMs) / 1000, "-s", "320x240", "-r", "15", "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputFileAbsolutePath};

-ss
试图定位(我们要开始剪切视频的时间)
-t
限制从输入文件读取的数据的持续时间(从剪切开始位置到要剪切视频的持续时间)
先前命令中已定义的其他选项
如果要保持原始视频的分辨率,请删除-s 320×240。
要剪切视频而不进行重新编码,我们可以使用以下命令-

String[] complexCommand = { "-y", "-i", inputFileAbsolutePath,"-ss", "" + startMs / 1000, "-t", "" + (endMs - startMs) / 1000, "-c","copy", outputFileAbsolutePath};

-c copy
将视频,音频和比特流从输入复制到输出文件,而无需重新编码。

Extract images from video

要从视频中提取图像,我们可以使用以下命令

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-an", "-r", "1/2", "-ss", "" + startMs / 1000, "-t", "" + (endMs - startMs) / 1000, outputFileAbsolutePath};

-an
Disable audio recording.
-r
1/2将从视频的每2秒中提取一个图像帧。类似地,-r 1/4将从视频的每4秒中提取一个图像帧,-r 1将从视频的每一秒中提取一个图像帧。

如果要从指定的持续时间内将所有视频帧提取为图像,请删除-r选项(上述命令中的-r 1/2)。

先前命令中已定义的其他选项

Extract audio from video

要从视频中提取音频,我们可以使用以下命令

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

-vn
Disable video recording
-f
format

Add Fade In Fade Out effect at start and end of video

要在视频的开始和结束处分别添加淡入和淡出效果,我们可以使用以下命令

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-acodec", "copy", "-vf", "fade=t=in:st=0:d=5,fade=t=out:st=" + String.valueOf(duration - 5) + ":d=5", outputFileAbsolutePath};

-acodec

设置音频编解码器

–vf filtergraph (output)

创建filtergraph指定的filtergraph并使用它过滤流。

fade = t = in:st = 0:d = 5

淡入视频的前5秒
fade = t = out:st =“ + String.valueOf(duration-5)+”:d = 5“

淡出最后5秒的视频

Fast Motion Video

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-filter_complex", "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputFileAbsolutePath};

-filter_complex filtergraph (global)

Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or outputs.

[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]

过滤器通过更改每个视频帧的显示时间戳(PTS)来工作。 例如,如果在时间戳1和2处显示两个成功的帧,并且您想加快视频的速度,则这些时间戳分别需要变为0.5和1。 因此,我们必须将它们乘以0.5。

您可以使用atemto音频过滤器来加快或减慢音频速度.atempo过滤器限于使用0.5到2.0之间的值(因此它可以将其减慢到不小于原始速度的一半,而将速度减慢到不超过原始速度的两倍) 为了将音频加速到其速度的两倍,我们必须使用atempo值2.0。
-map
-map选项是一种告诉FFmpeg从输入到输出要选择/复制的流的方法。要控制包括哪些流,则需要/想要手动指定“ -map”命令,并且 更改这些参数。
-map [v] -map [a] –选择标有v和a的流
-map 0-从输入0中选择所有流。
查看此以获得有关地图选项的详细说明

Slow Motion Video

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-filter_complex", "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputFileAbsolutePath};

过滤器通过更改每个视频帧的演示时间戳(PTS)来起作用。要减慢视频速度,您必须使用大于1的乘数。例如,如果在时间戳1和2上显示了两个连续帧,并且您 要减慢视频速度,这些时间戳分别需要变为2和4。因此,我们必须将它们乘以2.0。

您可以使用atemto音频过滤器来加快或减慢音频速度.atempo过滤器限于使用0.5到2.0之间的值(因此它可以将其减慢到不小于原始速度的一半,而将速度减慢到不超过原始速度的两倍) 为了将音频减慢至其速度的一半,我们必须使用atempo值0.5。

Reverse Video

对于倒转视频,首先,我们需要将视频划分为10秒或更短的时间段,因为除非设备具有32 GB的RAM,否则ffmpeg的反向视频命令不适用于长时间的视频。

因此,要反转视频,

1.将视频分为持续时间不超过10秒的片段。
2.反转分段视频
3.以反向顺序连接反向分割的视频。

String[] complexCommand = {"-i", inputFileAbsolutePath, "-c:v", "libx264", "-crf", "22", "-map", "0", "-segment_time", "6", "-g", "9", "-sc_threshold", "0", "-force_key_frames", "expr:gte(t,n_forced*6)", "-f", "segment", outputFileAbsolutePath};

-c:v libx264
使用libx264编码所有视频流
-crf
为恒定质量模式设置质量。
-segment_time
每个视频片段的时间
-g
GOP size
-sc_threshold
设置场景更改阈值。
-force_key_frames expr:gte(t,n_forced*n)
每n秒强制执行一次关键帧
分割视频后,我们需要反转分割后的视频。为此,我们需要运行一个循环,其中每个分割后的视频文件都将反转。

要反转带音频的视频(不删除其音频),我们可以使用以下命令-

String command[] = {"-i", inputFileAbsolutePath, "-vf", "reverse", "-af", "areverse", outputFileAbsolutePath};

要反转视频并删除音频,我们可以使用以下命令-

String command[] = {"-i", inputFileAbsolutePath, "-an", "-vf", "reverse", outputFileAbsolutePath};

要反转没有音频的视频,我们可以使用以下命令-

String command[] = {"-i",inputFileAbsolutePath, "-vf", "reverse", outputFileAbsolutePath};

反转分段视频后,我们需要以反向顺序串联反转分段视频。为此,我们使用Arrays.sort(files,LastModifiedFileComparator.LASTMODIFIED_REVERSE)根据最后修改的文件对视频进行排序。

然后,要串联反向分割的视频(带有音频),我们可以使用以下命令-

String command[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:v0] [0:a0] [1:v1] [1:a1]...[N:vN] concat=n=N:v=1:a=1 [v] [a],"-map","[v]","-map","[a]", outputFileAbsolutePath};

要串联反向分割的视频(不包含音频),我们可以使用以下命令-

String command[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:0] [1:0] [2:0]...[N:0] concat=n=N:v=1:a=0",outputFileAbsolutePath};

-filter_complex [0:v0] [0:a0] [1:v1] [1:a1]…[N:vN] tells ffmpeg what streams to send to the concat filter.In the above case, video stream 0 [0:v0] and audio stream 0 [0:a0] from input 0,video stream 1 [1:v1] and audio stream 1 [1:v1] from input 1 and so on.
concat过滤器用于连接音频和视频流,一个接一个地将它们连接在一起。该过滤器接受以下选项:
n
设置段数。 预设值为2。
v
设置输出视频流的数量,即每个段中的视频流的数量。 默认值为1。
一种
设置输出音频流的数量,也就是每个段中的音频流的数量。 默认值为0。

Adding presets

FFmpeg提供某些预设,这些预设是为过程提供一定速度的选项的集合。 预设的速度降序为:超快,超快,非常快,更快,快,中,慢,慢,非常慢。 默认预设为中。当命令需要花费太多时间执行并且您想加快处理速度时,超快速预设特别有用。例如在压缩,淡入或反转大尺寸视频时的示例。要使用预设,只需添加“ -preset”, “超快速”到命令。
例子-

String command[] = {“-i”, inputFileAbsolutePath,”-preset”, “ultrafast”, “-vf”, “reverse”, “-af”, “areverse”, outputFileAbsolutePath};

一般准则是使用您有耐心的最慢的预设。
请在此处查看有关选择预设的详细说明。

如果您喜欢我的帖子,请对其评分,因为这对我来说意义重大!

FFmpeg Video Editor相关推荐

  1. android movie studio 下载,Movie Studio+ Video Editor

    Movie Studio+ Video Editor 介绍 Movie Studio+ Video Editor Movie Studio+ is a video edit application f ...

  2. GiliSoft Video Editor 13中文版

    教程: 1.解压下载的压缩包,得到如下文件: 2.双击主程序开始安装: 3.选择安装路径:资源地址:GiliSoft Video Editor 13中文版 4.软件安装完成后直接启动软件. 5.启动K ...

  3. Movavi Video Editor 15 Plus for mac(视频编辑软件)

    movavi video editor mac破解版视频剪辑软件分享给大家,提供滤镜.过渡.片头还有标注等功能,剪切并联接视频剪辑而不降低质量.应用独具风格的视频效果和滤镜.添加音乐.片头等等,可以轻 ...

  4. 新手也可以制作出大片的效果——Movavi Video Editor 15 Plus Mac

    新手也可以制作出大片的效果--Movavi Video Editor 15 Plus Mac!Movavi Video Editor 15是应用在Mac上的一款强大的视频编辑软件,使用 160+滤镜和 ...

  5. 如何使用Movavi Video Editor去除影片中的声音或音乐

    当您拍摄了一段很精彩的短片,但是后来发现音讯夹杂了一些会让观众分散注意力,或什至感到不舒服的杂音,这时候您一定会觉得很可惜.幸好我们有拯救这种影片的速效方法:只要将声音从短片中移除,或什至替换为您自己 ...

  6. 如何用AVS Video Editor给视频添加文字?

    一般我们在给视频进行后期处理的时候,会需要给这个视频加入文字或者主题标题.大家都知道,大部分视频剪辑软件都支持这个操作,但就有用户问,这个给AVS Video Editor添加文字该怎么做呢? 首先我 ...

  7. 超好用的视频编辑工具:Movavi Video Editor 15 for Mac

    哪里有简单好上手的视频编辑工具?video editor mac破解版是运行在mac平台上超好用的视频编辑工具,拥有快速高效的家庭电影编辑和照片幻灯片制作所需的一切.只需将您的视频和照片导入到该程序中 ...

  8. 如何用AVS Video Editor这款视频编辑软件消除音频噪音?

    大家在日常录音的时候,因为没有非常专业的录音设备,录的音频里经常有许多的杂音,这时候就需要一款非常有效的软件来帮忙去除杂音,下面我将会为大家介绍如何用AVS Video Editor消除噪音. 1.打 ...

  9. Win Video Editor Pro 2022 v9.9.4.6 Windows视频编辑工具集合

    前言 Windows Video Editor(编辑工具集合)具有编辑视频文件所需的一切.您可以轻松剪切,裁剪,旋转,拆分,修剪或加入视频.您可以为视频添加效果,文本,动画,水印,字幕,音乐. 您可以 ...

  10. mac hdmi 不能调整音量_如何使用Movavi Video Editor调整影片音量

    你是否有遇过影片声音太安静,即使音量转到最大声,还是觉得听不清楚?这有可能是录影时你与主角距离太远,或者不小心遮住了录影机的麦克风.万一发生了这种情况,请不必伤脑筋去追究它是怎么发生的,也无需花时间再 ...

最新文章

  1. UTA研究团队提出首个3D点云+GAN新方法,让机器人“眼神”更犀利 | AI日报
  2. vs社区版到期离线激活_vs2019离线安装包
  3. Hex-Rays.Decompiler ...
  4. Adobe Audition录制音频与剪辑
  5. python顺时针旋转_Python之二维数组N*N顺时针旋转90度
  6. leetcode239. 滑动窗口最大值(思路+详解)
  7. 前端利用CryptoJS进行AES对称加解密(16进制编码)
  8. 【VS开发】C++调用外部程序
  9. 吴恩达机器学习学习笔记第三章:机器学习中的线性代数
  10. docker server 容器连接sql_借力 Docker ,三分钟搞定 MySQL 主从复制!
  11. 人生值得珍藏的80句话
  12. 1700x关闭超线程超频_关闭锐龙9 3900X超线程 游戏帧数居然更高
  13. B1029/A1084 旧键盘——测试点4
  14. 数据仓库概念以及选型
  15. ArcGis for js 查询定位、缩放致
  16. PKCS#11标准解读-Cryptoki库如何工作
  17. python彼岸图网爬取1200像素预览图
  18. 异构神经网络(3)MAGNN: Metapath Aggregated Graph Neural Network for Heterogeneous Graph Embedding
  19. 论文阅读:曝光过度,曝光不足增强算法Learning to Correct Overexposed and Underexposed Photos
  20. 计算不同色域下的RGB与YUV 以及 RGB与XYZ互转公式

热门文章

  1. JSP中乱码问题,你真的理解了么?
  2. 用POP动画编写带富文本的自定义动画效果
  3. 【VirtualBox】设置NAT端口映射-SSH登录
  4. (通用版)salesforce中soql及sosl的伪‘Like’模糊检索
  5. ISO C90 forbids mixed declarations and code 警告
  6. Matlab自带的曲线拟合程序
  7. c++程序设计原理与实践 第二十四章部分答案
  8. 【转载】WEB架构师成长之路
  9. IE7 绝对定位z-index问题
  10. 小组级Windows下架设git服务器