随着自媒体的兴起,很多人会***或者找视频素材剪辑,配上背景音乐或者解说,加上各种特效边框。经过处理后,他们会生成新的视频文件,发布到各大平台。生成的原始视频文件都很大,我们需要转换格式或者压缩大小,这样才能上传或者分享到定位器等其他设备上。
FFmpeg简介
FFmpeg是一个开源的免费多媒体视频处理工具。其功能包括视频捕获、视频格式转换、视频捕获、视频水印等。它为音频和视频的录制、转换和流式传输提供了完整的解决方案。
FFmpeg项目在开源界的影响力也是数一数二的。你看到的视频转换软件或者播放器中使用的几乎所有功能或者编解码都是基于FFmpeg的。它使用LGPL或GPL许可证。国内一些著名玩家使用FFmpeg源代码,未申报,被FFmpeg钉在了历史的耻辱柱上。
FFmpeg安装
FFmpeg提供源代码,可以自己编译。几乎所有的发行版Linux库都已经有FFmpeg了,可以直接安装。
# debian/ubuntuapt install ffmpeg# redhat/centos/fedora'yum install ffmpeg或dnf install ffmpeg
FFmpeg官方还提供二进制包:ffmpeg.org/download.html.
建议使用FFmpeg官方静态二进制包,不需要额外的动态库,只有一个可执行文件。官网下载ffmpeg后,有三个可执行文件:FFmpeg、ffprobe、ffplay。
FFmpeg使用
从官网下载的FFmpeg解压后有三个可执行文件:
ffmpeg:音视频文件处理转换ffprobe:读取视频文件信息ffplay:一个简易的播放器
Fft命令:
ffmpeg -i video.w***。/video.mp4
将video.w***视频文件转换为mp4格式。默认情况下,ffmpeg mp4格式使用h2***编码。
ffmpeg-I video . WMA-c:v libx 265 video . MP4
将video.w***视频文件转换为h265编码的mp4格式。
H265的压缩率比h2***高,低比特率生成的文件更小。
也就是说同等质量的h265代码比h2***更清晰。对于同样大小的视频文件,h265编码比h2***编码小。但当视频比特率达到一定规模时,两者差别不大。
h2***比h265有更好的兼容性。有些***默认不支持h265编码的视频文件,需要软件解码。
视频转换,h265编码比h2***编码耗时更长,消耗的CPU资源更多。
ffmpeg-I video.mp4-s 1280 ×720 video2.mp4
将视频压缩到1280 ×20分辨率。
ffmpeg-I video.mp4-ss 00:00:10-I video.mp4-t 00:00:30-c:v copy-c:a copy cut . MP4
在不改变视音频编码的情况下剪切视频,10秒视频后保留30秒,因为音视频编码指定了参数值copy,不会影响视频质量。
ss参数必须在-i之前使用。如果在-i之后写入,ffmpeg将理解起点应用于输出文件。
ffmpeg-I video.mp4-元数据:s:v rotate = ”90″-c:v copy -c:a copy out.mp4
将视频翻转90度,而不改变视频和音频的质量。将横屏改为竖屏。
ffmpeg-f X11 grab-r 30-I:0.0-f alsa-I HW:0.0-acodec AAC-vcodec libx 2*** out . mkv
使用FFmpeg视频录制,此命令在Linux上有效。每秒30帧,音频格式使用aac,视频格式使用h2***,输出mkv格式。
Vcodec和c:v参数一样,指定视频编码,比如libx2***和libx265
acodec和c:a参数一样,指定音频编码,比如aac、mp4和flac。
FFmpeg还有很多其他用途,比如调整码率,帧数等。使用ffmpeg & # 8211帮助可以看到所有参数的描述。
GPU加速
默认情况下,FFmpeg使用CPU编码。当执行ffmpeg命令时,资源管理器可以看到CPU使用率的增加。
如果使用GPU运算,转换速度可以提高一倍,尤其是h265编码视频的转换。
检查ffmpeg支持的视频编码格式:
ffmpeg -codecs
找到hevc,也就是h265代码:
HEVC _ QSV:英特尔核显HEVC _ NV ENC:英伟达显卡HEVC _ AMF:如果AMD显卡使用h2***编码,使用h2***_qsv/h2***_nvenc。
ffmpeg-I ./video . MP4-c:v hevc _ qsv。/out.mp4
使用GPU编码,运行上面的ffmpeg命令,可以看到GPU占用率增加了。
用GPU加速视频转换要快很多,我只能用比CPU转码快几倍的核显。
Ffprobe命令
ffprobe。/video.mp4
查看视频文件信息。
从输出信息可以看出,视频文件采用h2***编码,分辨率为1280 ×70,平均视频比特率为921kbps,24帧。视频音频采用aac编码,采样率为44100Hz,比特率为128kpbs。
ffprobe -v错误-show_streams -print_for***t json。/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(命令)。
使用call ffmpeg命令时,必须读取该命令输出流中的内容,这样程序才不会阻塞。否则,当缓冲区已满时,进程将被阻塞。
视频转换可能非常耗时,具体取决于硬件性能。在实际应用中,我们也可以打开线程来处理。
FFmpeg还提供C调用和公共库集成。以上方法并非最优解,仅提供参考。
本文来自奶味小仙女投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/517113.html