随着自媒体盛行,许多人会自拍视频或则找视频素材剪裁,配上背景音乐或解说,加上各类特效边框,处理后再生成新的视频文件,发布到各大平台。生成的原始视频文件都很大,我们须要转换格式或则压缩大小,以便上传或则在其他如手机等设备上分享。
FFmpeg介绍
FFmpeg是一款开源免费的多媒体视频处理工具,功能包括视频采集功能、视频格式转换、视频加壳、给视频加盐印等。它提供了录制、转换以及流化音视频的完整解决方案。
FFmpeg项目在开源界的影响力也是数一数二的。几乎你所看到的视频转换软件或播放器中用到的功能或编码/解码都基于FFmpeg。它采用LGPL或GPL许可证,曾今国外个别著名播放器使用FFmpeg源码未申明,被FFmpeg钉在历史的耻辱柱上。
FFmpeg安装
FFmpeg提供源码,可自行编译。几乎所有发行版Linux库房中已有FFmpeg,可以直接安装。
# debian/ubuntu
apt install ffmpeg
# redhat/centos/fedora'
yum install ffmpeg
或
dnf install ffmpeg
FFmpeg官方也提供二补码包:/download.html
推荐使用FFmpeg官方static二补码包,无需额外动态库,仅一个可执行文件官网下载后的FFmpeg解压后有三个可执行文件:ffmpeg、ffprobe、ffplay。
FFmpeg使用
官网下载后的FFmpeg解压后有三个可执行文件:
ffmpeg:
ffmpeg-ivideo.wma./video.mp4
把video.wma视频文件转换成mp4格式。ffmpegmp4格式默认使用h264编码
ffmpeg-ivideo.wma-c:vlibx265video.mp4
把video.wma视频文件转换成h265编码的mp4格式。
h265比h264编码有更高的压缩率,在低分辨率下生成的文件更小。
也就是说,相同质量下的h265编码比h264更清晰。相同大小的视频文件,h265编码比h264编码的视频文件容积更小。并且当视频分辨率抵达一定大小时,二者清晰度区别不大。
h264比h265有更好的兼容性,有些手机默认不支持h265编码的视频文件,须要利用软件解码。
视频转换,h265编码比h264编码用时会更长,更消耗CPU资源。
ffmpeg-ivideo.mp4-s1280x720video2.mp4
将视频压缩到1280x720帧率。
ffmpeg-ivideo.mp4-ss00:00:10-ivideo.mp4-t00:00:30-c:vcopy-c:acopycut.mp4
不改变视频和音频的编码截剪视频,保留从视频10秒以后开始30秒,由于音频视频编码指定参数值copy,不会影响视频质量。
使用ss参数一定要在-i之前,假如写在-i以后ubuntu下音乐播放器,ffmpeg会理解为起始点是作用于输出文件。
ffmpeg-ivideo.mp4-metadata:s:vrotate="90"-c:vcopy-c:acopyout.mp4
不改变视频和音频的质量将视频翻转90度。把横屏变竖屏。
ffmpeg-fx1111grab-r30-i:0.0-falsa-ihw:0,0-acodecaac-vcodeclibx264out.mkv
使用FFmpeg录象,该在Linux上有效。每秒30帧,音频格式使用aac,视频格式使用h264,输出mkv格式。
vcodec与c:v参数一样,指定视频编码,如:libx264,libx265
acodec与c:a参数一样,指定音频编码,如:aac,mp4,flac
FFmpeg还有好多其他用法,例如调整帧率,帧率等。使用ffmpeg--help可以看见全部参数说明。
GPU加速
FFmpeg默认使用CPU编码。执行ffmpeg时,资源管理器可以看见CPU使用率下降。
假如使用GPU运算,转换速率能成倍提升,非常是转换h265编码视频。
查看ffmpeg支持视频编码格式:
ffmpeg -codecs
找到hevc,也就是h265编码:
假如使用h264编码linux命令ls,使用h264_qsv/h264_nvenc。
ffmpeg-i./video.mp4-c:vhevc_qsv./out.mp4
使用GPU编码雨林木风linux,运行以上ffmpeg命令,可以看见GPU占用率下降。
使用GPU加速视频转换速率快了好多,我仅使用核显速率也比CPU转码也能快数倍。
ffprobe命令
ffprobe./video.mp4
查看视频文件信息。
从输出信息可以看见该视频文件是使用h264编码,帧率1280x720,视频平均帧率921kbps,24帧。视频的音频使用aac编码,取样率44100Hz,分辨率128kpbs。
ffprobe-verror-show_streams-print_formatjson./video.mp4
使用json格式输出视频信息。
ffplay命令
ffplay./video.mp4
播放视频文件。这时会弹出一个播放器。
ffplay命令还有好多控制参数。不过我认为好处不大,虽然图形化播放器更好用,功能也更强悍。
开发集成
使用FFmpeg命令,我们可以用程序或完成视频手动转换。也可以让我们开发的系统拥有视频转码,或读取视频信息的功能。以Java示例:
public static int doWaitFor(Process process) {
InputStream in = null;
InputStream err = null;
int exitValue = -1; // returned to caller when p is finished
try {
in = process.getInputStream();
err = process.getErrorStream();
boolean finished = false; // Set to true when p is finished
while (!finished) {
try {
while (in.available() > 0) {
// Print the output of our system call
Character c = new Character((char) in.read());
System.out.print(c);
}
while (err.available() > 0) {
// Print the output of our system call
Character c = new Character((char) err.read());
System.out.print(c);
}
// Ask the process for its exitValue. If the process
// is not finished, an IllegalThreadStateException
// is thrown. If it is finished, we fall through and
// the variable finished is set to true.
exitValue = process.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
// Process is not finished yet;
// Sleep a little to save on CPU cycles
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (err != null) {
try {
err.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return exitValue;
}
Java调用外部命令使用Runtime.getRuntime().exec(command)。
在使用调用ffmpeg命令时,必需要读取执行命令输出流中的内容ubuntu下音乐播放器,程序才不会阻塞。否则缓冲读满后,进程会卡住。
视频转换会特别历时,取决于硬件性能。在实际应用中,我们也可以开启线程去处理。
FFmpeg还提供C调用,公共库集成。以上方式并不是最优解决方案,仅提供一种参考。
本文原创地址://lrxjmw.cn/fspclgjzmtsp.html编辑:刘遄,审核员:暂无