参考: https://blog.csdn.net/weixin_42081389/article/details/100543007

ffmpeg可视化界面软件:Quick Cut
参考:https://zhuanlan.zhihu.com/p/163652478

ffmpeg一些命令参数:

在这里插入图片描述

通用选项

命令解释
-Llicense
-h帮助
-fromats显示可用的格式,编解码的,协议的。。。
-f fmt强迫采用格式fmt
-I filename输入文件
-y覆盖输出文件
-t duration设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string设置标题
-author string设置作者
-copyright string设置版权
-comment string设置评论
-target type设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq激活高质量设置
-itsoffset offset设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

视频选项

命令解释
-b bitrate设置比特率,缺省200kb/s
-r fps设置帧频 缺省25
-s size设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size设置顶部切除带大小 像素单位
-cropbottom size –cropleft size –cropright size
-padtop size设置顶部补齐的大小 像素单位
-padbottom size –padleft size –padright size –padcolor color设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
-vn不做视频记录
-bt tolerance设置视频码率容忍度kbit/s
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate设置最小视频码率容忍度
-bufsize size设置码率控制缓冲区大小
-vcodec codec强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。
-sameq使用同样视频质量作为源(VBR)
-pass n选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file选择两遍的纪录文件名为file

高级视频选项

命令解释
-g gop_size设置图像组大小
-intra仅适用帧内编码
-qscale q使用固定的视频量化标度(VBR)
-qmin q最小视频量化标度(VBR)
-qmax q最大视频量化标度(VBR)
-qdiff q量化标度间最大偏差 (VBR)
-qblur blur视频量化标度柔化(VBR)
-qcomp compression视频量化标度压缩(VBR)
-rc_init_cplx complexity一遍编码的初始复杂度
-b_qfactor factor在p和b帧间的qp因子
-i_qfactor factor在p和i帧间的qp因子
-b_qoffset offset在p和b帧间的qp偏差
-i_qoffset offset在p和i帧间的qp偏差
-rc_eq equation设置码率控制方程 默认tex^qComp
-rc_override override特定间隔下的速率控制重载
-me method设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames使用frames B 帧,支持mpeg1,mpeg2,mpeg4
-mbd mode宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv使用4个运动矢量 仅用于mpeg4
-part使用数据划分 仅用于mpeg4
-bug param绕过没有被自动监测到编码器的问题
-strict strictness跟标准的严格性
-aic使能高级帧内编码 h263+
-umv使能无限运动矢量 h263+
-deinterlace不采用交织方法
-interlace强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr计算压缩帧的psnr
-vstats输出视频编码统计到vstats_hhmmss.log
-vhook module插入视频处理模块 module 包括了模块名和参数,用空格分开

音频选项

命令解释
-ab bitrate设置音频码率
-ar freq设置音频采样率
-ac channels设置通道 缺省为1
-an不使能音频纪录
-acodec codec使用codec编解码

音频/视频捕获选项

命令解释
-vd device设置视频捕获设备。比如/dev/video0
-vc channel设置视频捕获通道 DV1394专用
-tvstd standard设置电视标准 NTSC PAL(SECAM)
-dv1394设置DV1394捕获
-av device设置音频设备 比如/dev/dsp

高级选项

命令解释
-map file:stream设置输入流映射
-debug打印特定调试信息
-benchmark为基准测试加入时间
-hex倾倒每一个输入包
-bitexact仅使用位精确算法 用于编解码测试
-ps size设置包大小,以bits为单位
-re以本地帧频读数据,主要用于模拟捕获设备
-loop循环输入流。只工作于图像流,用于ffserver测试
avi转MP4命令:
ffmpeg -i .\Video.avi -c copy -map 0 video.mp4
或
ffmpeg -i .\Video.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2  video.mp4

//剪切视频
ffmpeg -ss 0:1:30 -t 0:0:50 -i 1.avi -vcodec copy -acodec copy 3.mp4    
//-r 提取图像的频率,-ss 开始时间,-t 持续时间

MP4转ts
ffmpeg -i .\video.mp4 output.ts
视频压缩
 1)ffmpeg -i 123_ffmpeg.mp4  (压缩的文件更大更清晰,一般情况下不用)

 2)ffmpeg.exe -i 123.MP4 -b:v 700k 1231_ffmpeg.mp4(压缩的更小,相对模糊一些)
去除视频声音
 ffmpeg -i 1.avi -vcodec copy -an 2.avi  
合并音频和视频
ffmpeg -i a.wav  -i a.avi out.avi 

若音频比视频长,画面停留在最后一帧,继续播放声音。

给视频添加水印
ffmpeg -i result2.mp4 -vf "drawtext=fontfile=FZBaoHTJW_Xi.TTF: text='创作者:奮乧妑_仯姩':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4
视频剪辑
//截取从头开始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
//截取从30s开始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4

给视频添加字幕srt

参考:https://moejj.com/ffmpeg-add-subtitles-and-watermark/

ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
同时给视频添加音乐+字幕
ffmpeg -i .\1111.mp4 -i .\2222.mp3 -vf subtitles=all_mp3_srt.srt out2.avi
使用ffmpeg webm 转换 mp4

参考:http://www.voidcn.com/article/p-evqojtvk-bta.html

ffmpeg -fflags +genpts -i .\111.webm  -r 24 1.mp4

解释:

  • -r 24 代码生成的视频时24帧,你也可以改成30或者60
  • -i .\111.webm 111.webm 是我的当前目录下 webm格式的视频
  • 1.mp4 会在当前目录下生成 这个mp4视频
合并俩个mp4视频
先创建一个name.txt
file 'split1.mp4'

file 'split2.mp4'

在这里插入图片描述

命令合并
ffmpeg -f concat -i name.txt -c copy output.mp4

在这里插入图片描述

视频格式使用

ffmpeg -i 1.mp4 -vcodec mpeg2video -s 1920x1080 -q:v 1 -acodec copy -f mpegts 2.flv

转换格式的视频清晰度还可以
在这里插入图片描述
用java代码来进行操作

/**
     * 简易视频处理 -- (cmd(windows): ffmpeg.exe -i test1.mp4 newVideo.avi)
     *
     * @param ffmpegPath      ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取
     * @param videoInputPath  视频文件路径(输入)
     * @param videoOutputPath 转换完成的文件路径(输出)
     * @throws IOException
     */
    public static void videoConvert(String ffmpegPath, String videoInputPath, String videoOutputPath) throws IOException {
        // 构建命令
        String videoCommend=ffmpegPath+" -i "+videoInputPath+" -vcodec mpeg2video -s 1920x1080 -q:v 1 -acodec copy -f mpegts "+videoOutputPath;
        // 执行操作
        ProcessBuilder builder = new ProcessBuilder(videoCommend.split(" "));
        Process process = builder.start();
        InputStream errorStream = process.getErrorStream();
        InputStreamReader isr = new InputStreamReader(errorStream);
        BufferedReader br = new BufferedReader(isr);
        String line = "";
        while ((line = br.readLine()) != null) {
        }
        if (br != null) {
            br.close();
        }
        if (isr != null) {
            isr.close();
        }
        if (errorStream != null) {
            errorStream.close();
        }
    }

提取视频中的音频和视频

提取某个视频的纯视频不包含音频:

ffmpeg -i E:\hevc\2.mp4 -vcodec copy -an E:\hevc\2_bak.mp4

提取某个视频中的音频文件:

ffmpeg -i E:\hevc\2.mp4 -acodec libmp3lame -vn E:\hevc\2_copy.mp3

其他音频格式:https://blog.csdn.net/zhubao124/article/details/104740770

合并音频和视频

前提是这个视频里没有音频

ffmpeg.exe -i C:\Users\29265\Desktop\像鱼.mp3 -i C:\Users\29265\Desktop\1\2_copy.mp4 -t 300 -y C:\Users\29265\Desktop\1\newVideo.mp4

视频按帧截图

参考:https://zhuanlan.zhihu.com/p/38961122

主要用于用户手动截图或者上传视频生成缩略图。

此处:-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,-vframes 设置转换多少桢(frame)的视频,此命令是获取第一秒第一帧的截图。

注:生成的截图最好使用jpg格式,占用空间较小,如果需要使用其他格式,根据业务需求自行设置即可。

ffmpeg.exe -ss 00:00:01 -y -i test1.mp4 -vframes 1 new.jpg

用java代码来实现:

/**
 * 音视频合并,视频结束,音频结束 -- (cmd(windows): ffmpeg.exe -i test2.mp3 -i test1.mp4 -t 10 -y newVideo.mp4)
 *
 * @param ffmpegPath      ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取
 * @param audioInputPath  音频文件路径(输入)
 * @param videoInputPath  视频文件路径(输入)
 * @param time            文件时长
 * @param videoOutputPath 转换完成的文件路径(输出)
 * @throws IOException
 */
public static void audioVideoMerge(String ffmpegPath, String audioInputPath, String videoInputPath, double time, String videoOutputPath) throws IOException {
	// 构建命令
	List<String> command = Lists.newArrayList();
	command.add(ffmpegPath);
	command.add("-i");
	command.add(audioInputPath);
	command.add("-i");
	command.add(videoInputPath);
	command.add("-t");
	command.add(String.valueOf(time));
	command.add("-y");
	command.add(videoOutputPath);
	// 执行操作
	ProcessBuilder builder = new ProcessBuilder(command);
	Process process = builder.start();
	InputStream errorStream = process.getErrorStream();
	InputStreamReader isr = new InputStreamReader(errorStream);
	BufferedReader br = new BufferedReader(isr);
	String line = "";
	while ((line = br.readLine()) != null) {
	}
	if (br != null) {
		br.close();
	}
	if (isr != null) {
		isr.close();
	}
	if (errorStream != null) {
		errorStream.close();
	}
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐