FFMpeg的基本介绍

1 FFMpeg的基本概念

1.1 FFMpeg是什么

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。
FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X 等。
这个项目最早由 Fabrice Bellard 发起,2004 年至 2015 年间由 Michael Niedermayer 主要负责维护。许多 FFmpeg 的开发人员都来自 MPlayer 项目,而且当前 FFmpeg 也是放在MPlayer 项目组的服务器上。项目的名称来自 MPEG 视频编码标准,前面的"FF"代表"Fast Forward"。

1.2 FFmpeg 的组成

构成 FFmpeg 主要有三个部分:

第一部分:工具

第一部分是四个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffserver.exe和 ffprobe.exe。

  • ffmpeg.exe:音视频转码、转换器
  • ffplay.exe:简单的音视频播放器
  • ffserver.exe:流媒体服务器
  • ffprobe.exe:简单的多媒体码流分析器
第二部分:SDK

第二部分是可以供开发者使用的 SDK,为各个不同平台编译完成的库。
如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:

  • libavcodec:包含音视频编码器和解码器。编解码库,封装了 Codec 层,但是有一些 codec 是具备自己的 License 的,FFmpe 不会默认添加像 libx264、FDK-AAC、Lame 等库,但是 FFmpeg 是一个平台,可以将其他的第三方 codec 以插件的方式添加进来,为开发者提供统一接口。
  • libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能。核心工具库,最基础模块之一,其他模块都会依赖该库做一些基本的音视频处理操作。
  • libavformat:包含多种多媒体容器格式的封装、解封装工具。文件格式和协议库,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开者来说是透明的。
  • libavfilter:包含多媒体处理常用的滤镜功能。音视频滤镜库,该模块包含了音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,可以使用该模块高效的为音视频数据做特效处理。
  • libavdevice:用于音视频数据采集和渲染等功能的设备相关。输入输出设备库,比如需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同事也需要 libsdl 的预先编译,该设备模块播放声音和视频都又是使用 libsdl 库。
  • libswscale:用于图像缩放和色彩空间和像素格式转换功能。该模块用于图像格式转换,可以将 YUV 的数据转换为 RGB 的数据。
  • libswresample:用于音频重采样和格式转换等功能。用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。
  • libpostproc:该模块用于进行后期处理,当我们使用 filter 的时候,需要打开这个模块,filter 会用到这个模块的一些基础函数。

比较老的 ffmpeg 还会编译出 avresamle 模块,也是用于对音频原始出具进行重采样的,但是已经被废弃,推荐使用 libswresample 替代。另外,库里还可以包含对 H.264/MPEG-4 AVC 视频编码的 X264 库,是最常用的有损视频编码器,支持 CBR、VBR 模式,可以在编码的过程中直接改变码率的设置,在直播的场景中非常适用!可以做码率自适应的功能。

第三部分:源码

第三部分是整个工程的源代码,无论是编译出来的可执行程序还是 SDK,都是由这些源代码编译出来的。
FFmpeg 的源代码由 C 语言实现,主要在 Linux 平台上进行开发。
FFmpeg 不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。

1.3 FFmpeg 主要功能

多媒体视频处理工具 FFmpeg 有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
视频采集功能:
ffmpeg 视频采集功能非常强大,不仅可以采集视频采集卡或 USB 摄像头的图像,还可以进行屏幕录制,同时还支持以 RTP 方式将视频流传送给支持RTSP、RTMP的流媒体服务器,支持直播应用。
视频格式转换功能:
ffmpeg 视频转换功能。视频格式转换,比如可以将多种视频格式转换为 flv 格式,可不是视频信号转换 。ffmpeg 可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod 等),例如可以将摄录下的视频 avi 等转成视频网站所采用的 flv 格式。
视频截图功能:
对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓 gif 文件;因为抓出的 gif 文件大而播放不流畅。

1.4 FFmpeg的Java api

在java里使用ffmpeg需要使用javacv的框架,javacv底层会默认调用ffmpeg的sdk从而使用ffmpeg。

implementation 'org.bytedeco:javacv:1.5.8'
implementation 'org.bytedeco:ffmpeg-platform:5.1.2-1.5.8'
  • ffmpeg的简易使用
    /**
     * 获取到视频采集对象
     */
    public FFmpegFrameGrabber createGrabber() {
        // 采集桌面
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
        // 选择采集组件
        grabber.setFormat("gdigrab");
        // 采集的坐标
        grabber.setOption("offset_x", "0");
        grabber.setOption("offset_y", "0");
        // 采集帧率
        grabber.setOption("framerate", String.valueOf(ROTE));
        // 是否需要鼠标
        grabber.setOption("draw_mouse", "0");
        // 采集视频分辨率
        grabber.setOption("video_size", RESOLUTION);
        return grabber;
    }

    /**
     * 获取到推流对象
     */
    public FFmpegFrameRecorder createRecorder(int width, int height, int channel)
     throws MalformedURLException {
        FFmpegFrameRecorder recorder = 
            new FFmpegFrameRecorder(SRS_URL, width, height, channel);
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setFormat("flv");
        return recorder;
    }

    public static void main(String[] args) throws Exception {
        Capture c = new Capture();
        FFmpegFrameGrabber grabber = c.createGrabber();
        // 开始采集
        grabber.start();
        // 获取当前视频帧
        Frame grab = grabber.grab();
        // 释放
        grabber.release();
        // 结束采集
        grabber.stop();
        FFmpegFrameRecorder recorder = c.createRecorder(grabber.getImageWidth(), 
                                                             grabber.getImageHeight(), 
                                                             grabber.getAudioChannels());
        // 打开推流器
        recorder.start(grab);
        // 将一帧画面推到服务器
        recorder.record(frame);
        // 释放
        recorder.release();
        // 结束采集
        recorder.stop();
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值