赞
踩
implementation("com.arthenica:mobile-ffmpeg-full:4.4")
/** * 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); }); }
/** * @param start 裁剪开始时间 * @param duration 裁剪长度 */ @UnstableApi private 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(); } }
-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 复制音频流。
@UnstableApi private 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(); } }
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(); }); }
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或直接写90 OUTPUT:会在视频文件所在的文件夹下生成图像文件 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.mpg 5. 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.mp4 3.在视频中添加文字: ffmpeg -i input.mp4 -vf "drawtext=text='Hello World': fontfile=arial.ttf.fontsize=20: fontcolor=white: x=10:y=10" output.mp4 3.调整视频的播放速度: ffmpeg -iinput.mp4 -filter:v setpts=0.5*PTS output.mp4 4.合并两个视频文件: 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。