ffmpeg|青训营笔记

127 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第13天

概念

流媒体:就是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议;CDN 直播中常用的流媒体协议包括 RTMP,HLS,HTTP FLV

音视频编解码

我们可以通过http、rtmp或者本地的视频文件去播放视频。这里的"视频"实际上指的是mp4、avi这种既有音频也有视频的文件格式。

这样的视频文件可能会有多条轨道例如视频轨道、音频轨道、字幕轨道等. 有些格式限制比较多,例如AVI视频轨道只能有一条,音频轨道也只能有一条. 而有些格式则比较灵活,例如OGG视频的视频、音频轨道都能有多条.

像音频、视频这种数据量很大的轨道,上面的数据实际上都是通过压缩的。 视频轨道上可能是H264、H256这样压缩过的图像数据,通过解码可以还原成YUV、RGB等格式的图像数据。 音频轨道上可能是MP3、AAC这样压缩过的的音频数据,通过解码可以还原成PCM的音频裸流。

java-ffmpeg来获取视频第一帧

如下我是这样来用的首先创造这样的线程任务、取帧运用frame,之后再用Image的相关类来获取视频第一帧

FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(System.getProperty("user.dir")+File.separator+"video"+File.separator+filePath + File.separator + fileName);
grabber.start();
int ftp = grabber.getLengthInFrames();
int flag = 0;
Frame frame = null;
while (flag <= ftp) {
    //获取帧
    frame = grabber.grabImage();
    //过滤前 second 帧,避免出现全黑图片
    if ((flag > second) && (frame != null)) {
        break;
    }
    flag++;
}
   Java2DFrameConverter converter = new Java2DFrameConverter();
     BufferedImage bufferedImage = converter.getBufferedImage(frame);

整体结构

AVUtil:核心工具库,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。 AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。 AVCodec:编解码库,封装了Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口。 AVFilter:音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。 AVDevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同时也需要SDL的预先编译,因为该设备模块播放声音与播放视频使用的都是SDL库。 SwrRessample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。 SWScale:该模块是将图像进行格式转换的模块,比如,可以将YUV的数据转换为RGB的数据,缩放尺寸由1280_720变为800_480。 PostProc:该模块可用于进行后期处理,当我们使用AVFilter的时候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。