欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > android ffmpeg视频抽帧 ffmpeg视频长度裁剪 ffmpeg视频区域裁剪 ffmpeg视频压缩

android ffmpeg视频抽帧 ffmpeg视频长度裁剪 ffmpeg视频区域裁剪 ffmpeg视频压缩

2024/10/24 5:19:08 来源:https://blog.csdn.net/qq_28934205/article/details/141158065  浏览:    关键词:android ffmpeg视频抽帧 ffmpeg视频长度裁剪 ffmpeg视频区域裁剪 ffmpeg视频压缩
    implementation("com.arthenica:mobile-ffmpeg-full:4.4")

1.ffmpeg视频抽帧

    /*** ffmpeg -i "123.mp4" -r 5 -q:v 2 -f image2 %d.jpeg* <p>* 备注:* -i 是用来获取输入文件的名称,-i “123.mp4” 就是获取这个叫做123的mp4视频文件,当然你用avi格式之类的也可以;* -r 是设置每秒提取图片的帧数,也即采样率,-r 5的意思就是每秒抽取5张视频帧;* -q:v 2 这个可以提高抽取到的图片的质量的;* -f 是设定输出格式,这里image2就是图像解析模式,还有contact连接模式等;* %d.jpeg,可以指定文件的输出名字jpeg,jpg,png之类的都可以,也可以在前面加个路径,变成 /data/mp4-%05d.jpeg** @param path*/private void startShootVideoThumb(String path) {String dicName = DIR_IMAGE_ANALYSIS + new Date().getTime();FileUtil.getInstance().initDirectory(dicName);String ffmpegCmd = "-i " + path + " -r 1 -f image2 " + dicName + "/frame%04d.png";String[] command = ffmpegCmd.split(" ");System.out.println(Arrays.toString(command));FFmpeg.executeAsync(command, (executionId, returnCode) -> {LogUtil.e("文件解码=" + (returnCode == 0));File[] files = FileUtil.getInstance().getFiles(dicName);LogUtil.e("文件解码=" + files.length);});}

2.ffmpeg视频长度裁剪

    /*** @param start 裁剪开始时间* @param duration 裁剪长度*/@UnstableApiprivate void cutVideoLong(double start, double duration) {LogUtil.e("视频长度裁剪");String out = StorageUtil.getCacheDir() + File.separator + "editVideo.mp4";StorageUtil.deleteFile(out);String cmd = "-ss " + start + " -t " + duration + " -accurate_seek" + " -i " + mFilename + " -codec copy -avoid_negative_ts 1 " + out;LogUtil.e(cmd);String[] command = cmd.split(" ");try {FFmpeg.executeAsync(command, (executionId, returnCode) -> {LogUtil.e("文件长度裁剪" + (returnCode == 0));if (returnCode == 0) {cutVideoSize(out);} else {showToast("文件裁剪失败!");dialog.dismiss();}});} catch (Exception e) {e.printStackTrace();}}

3.ffmpeg视频区域裁剪

-i input.mp4 指定输入视频文件。-ss 00:00:00 开始时间。-t 00:00:10 截取视频的时长。-vf "crop=out_w:out_h:x:y" 指定裁剪的宽度(out_w)、高度(out_h)以及起始坐标(x, y)。-codec:a copy 复制音频流。
    @UnstableApiprivate void cutVideoSize(String path) {float[] cutArr = cutView.getCutArr();float left = cutArr[0];float top = cutArr[1];float right = cutArr[2];float bottom = cutArr[3];int cutWidth = cutView.getRectWidth();int cutHeight = cutView.getRectHeight();float leftPro = left / cutWidth;float topPro = top / cutHeight;float rightPro = right / cutWidth;float bottomPro = bottom / cutHeight;//得到裁剪位置int videoWidth = player.getVideoFormat().width;int videoHeight = player.getVideoFormat().height;int cropWidth = (int) (videoWidth * (rightPro - leftPro));int cropHeight = (int) (videoHeight * (bottomPro - topPro));if (cropWidth % 2 != 0) {cropWidth = cropWidth - 1;}if (cropHeight % 2 != 0) {cropHeight = cropHeight - 1;}LogUtil.e("视频大小裁剪");String out = StorageUtil.getCacheDir() + File.separator + "cutVideo.mp4";StorageUtil.deleteFile(out);String[] command = new String[]{"-i", path, "-filter:v", "crop=" + cropWidth + ":" + cropHeight + ":" + left + ":" + top, out};LogUtil.e(Arrays.toString(command));try {FFmpeg.executeAsync(command, (executionId, returnCode) -> {LogUtil.e("文件大小裁剪" + (returnCode == 0));if (returnCode == 0) {processorVideo(out);} else {showToast("文件裁剪失败!");dialog.dismiss();}});} catch (Exception e) {e.printStackTrace();}}

4.ffmpeg视频压缩

 String cmd = "-i " + inputFile + " -b:v 2000k -s 720*1280 -r 30 " + outputFile;inputVideoPath 是原始视频文件的路径,
outputVideoPath 是压缩后视频文件的存储路径。
-b:v 参数设置视频的比特率
,-r 设置帧率,
-s 设置视频的分辨率。
    public static void compress(Context context, String inputFile, String outputFile, final VideoCompressListener callback) {LogUtil.e("视频压缩");String cmd = "-i " + inputFile + " -b:v 2000k -s 720*1280 -r 30 " + outputFile;LogUtil.e(cmd);String[] command = cmd.split(" ");FFmpeg.executeAsync(command, (executionId, returnCode) -> {LogUtil.e("文件压缩" + (returnCode == 0));if (returnCode == Config.RETURN_CODE_SUCCESS) {if (callback != null) {callback.onSuccess("视频压缩成功!");}} else {if (callback != null) {callback.onFailure("视频压缩失败!");}}callback.onFinish();});}

5.其他

1.FFMPEG裁剪视频命令:ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT其中各参数的说明如下:START: 开始时间。如00:01:20,表示裁剪部分从1分20秒处开始DURATION: 视频时长。如00:02:30,表示截取时长为2分30秒的视频INPUT :输入。表示原始视频文件OUTPUT:输出。-vcode copy和-acodec copy 表示所要使用的视频和音频的编码格式,copy表示原样拷贝。2.FFMPEG提取某一帧图像命令:ffmpeg -i INPUT -y -f image2 -ss TIME -vframes 1 OUTPUT其中各参数的说明如下:INPUT :输入。表示原始视频文件TIME:某个时间点,要提取的图像即为该时间点的图像。格式00:01:30或直接写90OUTPUT:会在视频文件所在的文件夹下生成图像文件3.FFMPEG合并视频文件命令:ffmpeg -i concat:”PART1.mpg|PART2.mpg” -vcodec copy -acodec copy OUTPUT.mpg其中各参数的说明如下:PART1:要合并的第一个视频文件的名字PART2:要合并的第二个视频文件的名字OUTPUT:合并后的视频文件的名字4.FFMPEG转换视频格式命令:ffmpeg -i INPUT -f mpeg OUTPUT例如:ffmpeg -i D:/temp1/avi -f mpeg D:/result.mpg5. FFMPEG将视频转换为图像帧命令:ffmpeg -i ./test/video.mpg -r 1 -f image2 temp/%05d.png
其中-r是表示图像的帧率。
ffmpeg -filter参数FFmpeg的-filter参数用于在音视频流上应用各种过滤器。这些过滤器可以用于添加效果、转换格式、调整大小和比特率等。-filter参数接受一个由逗号分隔的过滤器列表。过滤器在应用时按照给定的顺序依次执行。
常用过滤器1.scale:调整视频的大小。
可以指定目标宽度和高度,也可以指定比例因子。例如,使用filter参数`-filter:v scale=640:480`可以将视频调整为宽度为640像素高度为480像素的大小。2.crop:裁剪视频的指定区域。
可以指定左上角的坐标以及裁剪后的宽度和高度。例如,使用filter参数`-filter:v crop=320:240:10:10`可以裁剪视频,以保留左上角为(10, 10)、宽度为320像素、高度为240像素的区域。3.framerate:调整视频的帧率。
可以指定目标帧率。例如,使用filter参数filter:v framerate=30`可以将视频的帧率设置为30fps。4. drawtext:在视频中添加文字。
可以指定文字内容、字体、大小、颜色、位置等参数。例如,使用filter参数`-filter:v"drawtext=text='Hello World':fontfile=arial.ttf: fontsize=20: fontcolor=white: x=10: y=10"可以在视频的左上角添加一个白色的20号字体的"Hello World"文字。5.setpts:调整视频的播放速度。
可以指定一个表达式来改变时间戳。例如,使用filter参数`-filter:v setpts=0.5*PTS`可以将视频的播放速度加快一倍。6.volume:调整音频的音量。
可以指定音量的增益值。例如,使用filter参数`filter:a volume=2.0`可以将音频的音量增加一倍。7.concat:合并多个视频或音频文件。
可以指定多个输入文件,并按指定的顺序进行合并。例如,使用filter参数`-filter complex"[0:v][1:v]concat=n=2:v=1[outv]; [0:a][1:a]concat=n=2:a=1[outa]" -map "[outv]"map "[outa]"可以将两个视频文件合并为一个输出文件。使用例子
1.调整视频的大小和帧率:
ffmpeg -iinput.mp4 -filter:v "scale=640:480,framerate=30'output.mp43.在视频中添加文字:
ffmpeg -i input.mp4 -vf "drawtext=text='Hello World': fontfile=arial.ttf.fontsize=20: fontcolor=white: x=10:y=10" output.mp43.调整视频的播放速度:
ffmpeg -iinput.mp4 -filter:v setpts=0.5*PTS output.mp44.合并两个视频文件:
ffmpeg -iinput1.mp4 -iinput2.mp4 -filter complex "[0:v][1:vconcat=n=2:v=1[outv]; [0:a][1:a]concat=n=2:a=1[outa]" -map "[outv]"map "[outa]" output.mp4

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com