> ffmpeg源码分析

ffmpeg源码简析(一)结构总览- https://blog.csdn.net/Louis_815/article/details/79621056
FFmpeg的库函数源代码分析- https://blog.csdn.net/lipengshiwo/article/details/52982379

FFmpeg  CPU软编码和解码 ;MediaCodec GPU硬编码解码。FFmpeg自带Rtmp协议支持。
  直播视频、短视频、小机构的内容、网络公司自制内容等;对编辑、转码、存储、传输、处理等技术;
  FFmpeg是一个全球领先的多媒体框架,能够友好的在大部分设备实现解码、编码、转码、复用、解复用、转码、混流、流媒体、过滤和播放。FFmpeg能够在各个平台(Linux、Mac OS X、Microsoft Windows、BSDs、Solaris等)和架构(x86、arm、mips等)中运行和编译。值得注意的是,FFMpeg并不是直接就可以用于各种视频的编解码工作,它只是一个框架。真正执行编解码工作的通常会用到其它编解码器。比如进行h264的编码,一般会选择FFMpeg配合x264进行使用。
  FFMPEG使用的是C99。而VC支持的是C89(不支持C99)。因此VC一般情况下是无法编译FFMPEG的源代码的。

-- 视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。
  跟视频领域相关的各个环节,包括内容、采集、编码、传输、接收、存储、解码、显示以及数据处理与挖掘;
   基于FFMPEG的音频编码器(PCM编码为AAC)。基于FFMPEG的视频编码器(YUV编码为H.264),YUV420P的像素数据编码为H.264的压缩编码数据。
视频编解码技术介绍- https://blog.csdn.net/mazhitong1020/article/details/78893190

--  ffmpeg开发,Android视频直播核心技术(架构)详解- https://www.2cto.com/kf/201708/667730.html
  主流的直播架构中主要有两种方案,即流媒体转发、P2P。流媒体转发,是一种在视频直播中以流的方式将连续的音、视频数据经编码压缩后传输到流媒体服务器,用户实时从服务器获取流媒体资源,而不必要等待整个文件下载文件完毕的C/S架构视频直播方案;P2P直播,是一种建立在P2P技术基础上的视频直播方案,它规定客户端之间使用一定协议来交换和共享直播数据,通过减少对服务器的数据请求,以降低服务端的I/O带宽等方面压力,从而削减服务器带宽成本,降低客户端卡播率。
  YUV是一种亮度信号Y和色度信号U、V是分离的色彩空间,它主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视,且与RGB要求三个独立的视频信号同时传输相比,它最大的优点在于只需占用极少的频宽,非常适用于流媒体传输。
  YUV格式分为两种类型,即Packet(包)和Plannar(平面)。Packet类型是将Y、U、V分量存储在同一个数组中,每个像素点的Y、U、V是连续交错存储的,常见的采样格式有NV21、NV12;Plannar类型是将Y、U、V分量分别存储在三个独立的数组中,且先连续存储所有像素点的Y分量,紧接着存储所有像素点的U分量,最后存储所有像素点的V分量,常见的采样格式有YV12、I420。
  H.264编码框架分为两层:VCL、NAL。VCL(Video Coding Layer,视频编码层),负责高效的视频内容表示;NAL(Network Abstraction Layer,网络抽象层),负责以网络所要求的恰当的方式对数据进行打包和传送。在H.264协议里定义了三种帧,完整编码的帧叫I帧(关键帧),参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。H.264编码采用的核心算法是帧内压缩和帧间压缩。其中,帧内压缩是生成I帧的算法,它的原理是当压缩一帧图像时,仅考虑本帧的数据而不用考虑相邻帧之间的冗余信息,由于帧内压缩是编码一个完整的图像,所以可以独立的解码显示;帧间压缩是生成P、B帧的算法,它的原理是通过对比相邻两帧之间的数据进行压缩,进一步提高压缩量,减少压缩比。

《H.264开源解码器评测》,这篇文章详细的评测了当今流行的几种h.264解码器,包括JM Decoder,T264 Decoder,X264 Decoder,ffmpeg libavcodec和Intel的IPP库,经过作者的评测,发现速度最快的就是intel IPP了,但是intel IPP属于商品化软件,而其他的各种解码器都属于开源项目,所以最适合选择的就是解码速度第二的ffmpeg了,而且其速度完全可以满足实时播放的要求。

> ffmpeg对视频文件进行解码的大致流程:
1. 注册所有容器格式和CODEC: av_register_all()
2. 打开文件: av_open_input_file()
3. 从文件中提取流信息: av_find_stream_info()
4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO
5. 查找对应的解码器: avcodec_find_decoder()
6. 打开编解码器: avcodec_open()
7. 为解码帧分配内存: avcodec_alloc_frame()
8. 不停地从码流中提取中帧数据: av_read_frame()
9. 判断帧的类型,对于视频帧调用: avcodec_decode_video()
10. 解码完后,释放解码器: avcodec_close()
11. 关闭输入文件:av_close_input_file()

-- FFmpeg 模块组成:
1.libavformat:解析各种格式的音视频文件、获取解码信息的读取音视频帧、为 libavcode 提供独立的音频视频的流
2.libavcodec: 适用于各种编解码协议的编解码器
3.libavdevice:硬件采集、加速、显示视频。
4.libavfilter:进行视频的转换,比如剪裁、伸缩、宽高比等等
5.libavutil:工具库
6.libavresample:。。
7.libswscale:比例缩放、色彩映射转换、图像色彩空间转换
8.libpostproc:音视频后期效果处理
9.ffmpeg:一个暴露到外部的工具
10.ffplay:简单的播放器,使用 ffmpeg 库进行解析和解码

> FFmpeg简述
-- ffmpeg有以下几个核心库,各个包的作用:
   1.libavformat:媒体格式,用于各种音视频封装格式的生成和解析及所支持的协议,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;包含多媒体容器格式的解码器和多路复用器的库。
   2.libavcodec:用于各种类型视频/声音/图像编解码;更加全面的编解码实现的合集
   3.libavutil:包含一些公共的工具函数;核心工具;包含简化编程功能的库,包括随机数生成器、数据结构、数学相关的程序、核心多媒体框架等等,包括算数运算,字符操作等。
   4.libswscale:用于视频场景比例缩放、色彩映射转换;执行高度优化的图像缩放和色彩空间/像素格式转换的库。
   5.libpostproc:用于后期效果处理,如图像的去块效应等;多媒体后处理器
   6. libavdevice:提供支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制,视频采集访问摄像头等;用于从许多常见的多媒体输入输出软件框架中获取和渲染,包括Video4Linux、Video4Linux2、VfW和ALSA。
   7.libavfilter:后处理,提供音视频的过滤器,如视频加水印、音频变声等,用做滤镜处理
   8.libswresample:提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的YUV转换,用于重采样;执行高度优化的音频重采样、再分频和采样格式转换操作的库;提供音频重采样,采样格式转换和混合等功能
   9.libavresample:提供音频的重采样工具。

> 用eclipse源码导入与调试ffmpeg- https://www.cnblogs.com/yinxiangpei/articles/3933778.html
FFmpeg- https://github.com/FFmpeg/FFmpeg
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libavformat:包含多种多媒体容器格式的封装、解封装工具
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
libavdevice:用于音视频数据采集和渲染等功能的设备相关
ibswresample:用于音频重采样和格式转换等功能
libavfilter:包含多媒体处理常用的滤镜功能

> FFmpeg其工具有:
1.ffmpeg:一个用于多媒体格式转换、解码或电视卡即时编码等的命令行工具
2.ffserver: 一个用于现场直播的多媒体流服务器或 HTTP 多媒体即时广播串流服务器
3.ffplay: 一个基于SDL和FFMpeg库的简单的媒体播放器;是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
4.ffprobe:一个简单的多媒体分析工具

> FFmpeg 视频水印/剪切/压缩/旋转/滤镜/美颜
-- Android实现视频剪切、视频拼接以及音视频合并- http://blog.csdn.net/lxy_tap/article/details/74567282
使用FFmpeg4android 实现视频 水印 剪切 压缩 旋转- http://blog.csdn.net/wning1/article/details/52029427
(1)最简单常规命令:处理视频
  ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -s 160x120 -r 25 -vcodec mpeg4 -b 150k -ab 48000 -ac 2 -ar 22050 /sdcard/videokit/out.mp4
   其中: -y -i 后接录制好的视频地址, -strict experiment  就是开启一些实验性的功能。 -s 输出的分辨率 如 640*480 480*480 -r 视频的帧数 -vcodec 视频编码-ab 128(音频数据流量,一般选择32、64、96、128) ac 声道 1 单声道 2 双声道 -ar 音频采样率。 一般的话控制视频输出质量参数 - s -b 增大-s 和 -b 都会提高视频的输出质量,当然相应的视频的size也会增大。
(2)截取视频特定时间的图片:
ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -an -r 1/2 -ss 00:00:00.000 -t 00:00:03 /sdcard/videokit/filename%03d.jpg
   其中: -ss 视频开始
(3)视频裁剪:
ffmpeg -y -i /sdcard/videokit/short.mp4 -strict experimental -vf crop=100:100:0:0  -r 15 -aspect 1:1 -ab 12288 -vcodec mpeg4 -b 2097152 -sample_fmt s16 /sdcard/videokit/out.mp4
   其中: crop里的参数依次为: 宽度,高度,left(距离左上角坐标),top(距离顶下角坐标)
(4)添加水印:
String[] complexCommand = {"ffmpeg","-y" ,"-i", "/sdcard/videokit/in.mp4","-strict","experimental", "-vf", "movie=/sdcard/videokit/watermark.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]","-s", "320x240","-r","30", "-b", "15496k", "-vcodec", "mpeg4","-ab", "48000", "-ac", "2", "-ar", "22050", "/sdcard/videokit/out.mp4"};
 5.ffmpeg解码截帧:H264格式的视频码流=>解码=>YUV格式的视频帧=>压缩=>jpeg=>保存到本地.
 6.将包含h264编码的mp4文件中的h264视频流提取出来保存为raw h264格式:
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
 7.行将包含h264编码的mp4文件转为ts文件格式:
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts

> FFmpeg 入门及源码分析
ffmpeg API变更 2009-03-01—— 2017-05-09变更 - https://blog.csdn.net/King1425/article/details/71439943
FFMPEG视音频编解码零基础学习方法- https://blog.csdn.net/leixiaohua1020/article/details/15811977
FFMPEG视音频编解码零基础学习方法- https://blog.csdn.net/simanstar/article/details/24348641
《FFmpeg从入门到精通》进阶篇,SEI那些事儿- https://blog.csdn.net/m0_37236246/article/details/79311345
FFmpeg从入门到出家(FFmpeg简析)- https://blog.csdn.net/m0_37236246/article/details/78983053
FFmpeg API 变更记录- https://blog.csdn.net/leixiaohua1020/article/details/41013567
ffmpeg必知道的知识点- https://blog.csdn.net/King1425/article/details/70348374
FFmpeg+OpenSL+OpenGL+Mediacodec 的视频播放SDK源码和实例APP,很适合学习ffmpeg解码流程- https://github.com/wanliyang1990/wlplayer
CMake编译FFmpeg(v3.3)并使用- https://github.com/WangShuo1143368701/FFmpegAndroid
ffmpeg源码整体分析- http://download.csdn.net/download/xin_hua_3/6247113
FFmpeg简单介绍- http://blog.csdn.net/momo0853/article/details/49427935
[总结]FFMPEG视音频编解码零基础学习方法- http://blog.csdn.net/leixiaohua1020/article/details/15811977
最简单的基于FFmpeg的AVfilter例子(水印叠加)- http://blog.csdn.net/leixiaohua1020/article/details/29368911
FFmpeg源代码结构图 - 解码- http://blog.csdn.net/leixiaohua1020/article/details/44220151
100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)- http://blog.csdn.net/leixiaohua1020/article/details/8652605
 -- FFmpeg视频/音频/图像编码器,FFmpeg RTMP推送和接收(ActionScript),最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
 FFmpeg示例程序合集- https://github.com/leixiaohua1020/leixiaohua1020.github.io/tree/master/batch

-- 使用FFMPEG类库分离出多媒体文件中的H.264码流,音频码流.  ffmpeg中的sws_scale来进行图像缩放和格式转换。ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv  。
  批处理脚本(BAT)调用FFMPEG批量编码视频。FFmpeg自带Rtmp协议支持。FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作。swscale主要用于在2个AVFrame之间进行转换。基于FFMPEG的图像编码器(YUV编码为JPEG)

-- FFMPEG在编译的时候可以选择支持RTMP的类库libRTMP。这样ffmpeg就可以支持rtmp://, rtmpt://, rtmpe://, rtmpte://,以及 rtmps://协议了。
 FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)。FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(),av_mallocz(),av_calloc(),av_free(),av_freep()。
 FFmpeg内存分配方面多次涉及到“内存对齐”(memory alignment)的概念。处理器相对比较“懒惰”,它会以2字节,4字节,8字节,16字节甚至32字节来存取内存。
 常见结构体的初始化和销毁(AVFormatContext,AVFrame等)。FFMPEG包含了解协议,解封装,解码操作结构体:
 AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等),包含码流参数较多的结构体。
 AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等),管理输入输出数据的结构体。
 在使用FFMPEG进行开发的时候,AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
 AVStream,AVCodecContext:视音频流对应的结构体,用于视音频编解码。
 AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)- 每一个视频/音频流信息的结构体。 
 AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)相关信息的结构体。
 AVCodec是存储编解码器信息的结构体。
 URLContext结构体中还有一个结构体URLProtocol。注:每种协议(rtp,rtmp,file等)对应一个URLProtocol。这个结构体也不在FFMPEG提供的头文件中。在解码的情况下,buffer用于存储ffmpeg读入的数据。例如打开一个视频文件的时候,先把数据从硬盘读入buffer,然后在送给解码器用于解码。

-- FFMPEG中结构体很多。最关键的结构体可以分成以下几类:
  a)解协议(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
  b)解封装(flv,avi,rmvb,mp4)
AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。
  c)解码(h264,mpeg2,aac,mp3)
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
  d)存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket,
解码后数据:AVFrame
第一次存储AVPacket之前需要在前面加上H.264的SPS和PPS。这些信息存储在AVCodecContext的extradata里面。

> ffmpeg
-- ffmpeg框架功能,如解码、编码、转码、混流、分离、转化为流、过滤以及播放几乎所有的由人和机器创建的媒体文件。
  在这个框架中包含有各种工具,每一个用于完成特定的功能。例如,ffserver能够将多媒体文件转化为用于实时广播的流,ffprobe用于分析多媒体流,ffplay可以当作一个简易的媒体播放器,ffmpeg则能够转换多媒体文件格式。
注意:ffmpeg和FFmpeg不是同一个东西。FFmpeg是框架,而ffmpeg是一个其中的一个功能。
-- ffmpeg提取音频&拼接音频,合并视频??
ffmpeg源码分析及录制/压缩/上传视频等,了解ffmpeg如何处理视频?

-- ffmpeg中主要分有三个主要用途用于媒体流的解码播放,媒体流的转换(解码之后再编码)和媒体流录制。
在ffmpeg中媒体流的解码播放流程:
 其主要流程为从媒体文件中读取出媒体流,然后送入媒体格式解码器(demuxer)中去除多余的外衣--媒体格式。然后送入ffmpeg的codec的decode中进行解码,最终生成显示需要的YUV格式的图片,然后再送入类似SDL中进行渲染。ffmpeg中媒体流的解码播放流程相对比较来说其最大的难点在于PTS的同步,在ffmpeg的ffplay中有很好的例子。
 媒体流的录制过程相当于媒体流转换的后半部分流程从YUV文件到media文件。
 ffplay播放器七个模块按广度顺序:读文件模块(source filter),解复用模块(Demux filter),视/音频解码模块(Decode filter),颜色空间转换模块(Color Space converter filter),视频/音频播放模块(Render filter)。

-- 为广播电视以及专业用途量身定制的FFmpeg。也是开源的,ffmbc 全称是 FFMedia Broadcast,是个改版的FFmpeg,有如下功能:
创建可以导入Final Cut Pro, AVID Media Composer, Adobe Premiere中的文件
创建 XDCAM HD422 文件(.mov 或 .mxf)
创建 XDCAM IMX/D-10 文件(.mov 或 .mxf)
创建 AVID DNxHD 文件(.mov)
创建 DVCPROHD 文件(.mov 或 .mxf)
创建 ProRes 422 or 4444 文件(.mov)
转换 V210 文件
转换 HD YUV BT709 到 SD BT601 或者反过来
转换 AVCIntra 50 和AVCIntra  100
转换 MPEG-TS 文件
转换 AVCHD 文件
转换 ProRes 422 和 4444 文件
合并或分离音轨
创建 Quicktime 文件
从 HD 到 SD的颜色转换;等等。。。
  项目主页上没有可执行文件,只有一个源代码压缩包。自己拿MinGW编译了一下源代码,发现和FFmpeg编译是一样的,编译后生成ffmbc.exe。
上传一个自己编译的ffmbc:http://download.csdn.net/detail/leixiaohua1020/6908055
项目主页:http://code.google.com/p/ffmbc/

> FFmpeg各种图像像素格式的转换
  FFmpeg Libswscale里面实现了各种图像像素格式的转换,例如YUV与RGB之间的转换;以及图像大小缩放(例如640x360拉伸为1280x720)功能。而且libswscale还做了相应指令集的优化,因此它的转换效率比自己写的C语言的转换效率高很多。
  几个图像像素数据处理过程中的几个知识点:像素格式,图像拉伸,YUV像素取值范围,色域。
  FFmpeg支持的像素格式的定义位于libavutil\pixfmt.h,是一个名称为AVPixelFormat的枚举类型。FFmpeg有一个专门用于描述像素格式的结构体AVPixFmtDescriptor。该结构体的定义位于libavutil\pixdesc.h。
 SWS_POINT(Nearest-neighbor interpolation, 邻域插值),领域插值可以简单说成“1个点确定插值的点”。例如当图像放大后,新的样点根据距离它最近的样点的值取得自己的值。换句话说就是简单拷贝附近距离它最近的样点的值。领域插值是一种最基础的插值方法,速度最快,插值效果最不好,一般情况下不推荐使用。一般情况下使用邻域插值之后,画面会产生很多的“锯齿”。SWS_BILINEAR(Bilinear interpolation, 双线性插值),双线性插值可以简单说成“4个点确定插值的点”。SWS_BICUBIC(Bicubic interpolation, 双三次插值),双三次插值可以简单说成“16个点确定插值的点”。

在广播电视系统中不传输很低和很高的数值,实际上是为了防止信号变动造成过载,因而把这“两边”的数值作为“保护带”。
 FFmpeg Libswscale支持色域的转换。目前最常见的三个标准中的色域:BT.601,BT.709,BT.2020。这三个标准中的色域逐渐增大。
 标清电视、高清电视和超高清电视标准中规定的色域。可以看出随着技术的进步,色域的范围正变得越来越大。标清电视(SDTV)色域的规定源自于BT.601。高清电视(HDTV)色域的规定源自于BT.709。超高清电视(UHDTV)色域的规定源自于BT.2020。

最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具。该工具可以生成视频测试时候常用的RGB/YUV格式的测试图片。包括灰阶测试图,彩条图,彩色条纹图,RGB渐变彩条图,YUV渐变彩条图,颜色视频等。在电视节目的制作播出及设备维护中,最常用的莫过于彩条信号了。这是由于彩条信号能正确反映出各种彩色的亮度、色调和饱和度,是检验视频通道传输质量最方便的手段。
  彩色条纹图,RGB渐变彩条图,RGB渐变彩条图;RGB颜色视频,YUV颜色视频;RGB24转BMP
  最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)。编码器 调用了FFmpeg中的libavformat和libavcodec两个库完成了视频编码工作。

> 格式转换,推流器
 基于FFMPEG的封装格式转换器。所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件)。需要注意的是,本程序并不进行视音频的编码和解码工作。而是直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件。
 和普通的转码软件相比,有以下两个特点:
 1.处理速度极快。视音频编解码算法十分复杂,占据了转码的绝大部分时间。因为不需要进行视音频的编码和解码,所以节约了大量的时间。
 2.视音频质量无损。因为不需要进行视音频的编码和解码,所以不会有视音频的压缩损伤。

基于FFmpeg的转码器。它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式。转码器在视音频编解码处理的程序中,属于一个比较复杂的东西。因为它结合了视频的解码和编码。一个视频播放器,一般只包含解码功能;一个视频编码工具,一般只包含编码功能;而一个视频转码器,则需要先对视频进行解码,然后再对视频进行编码,因而相当于解码器和编码器的结合。
  FFMPEG中有一个类库:libavfilter。该类库提供了各种视音频过滤器。

基于FFmpeg的AVDevice例子(屏幕录制)。基于FFmpeg的AVDevice例子(读取摄像头)。FFmpeg中有一个和多媒体设备交互的类库:Libavdevice。使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上。
 基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))。基于FFmpeg的内存读写的例子:内存播放器。

基于FFmpeg的推流器(simplest ffmpeg streamer)。推流器的作用就是将本地的视频数据推送至流媒体服务器。RTMP采用的封装格式是FLV。因此在指定输出流媒体的时候需要指定其封装格式为“flv”。同理,其他流媒体协议也需要指定其封装格式。例如采用UDP推送流媒体的时候,可以指定其封装格式为“mpegts”。没有封装格式的裸流(例如H.264裸流)是不包含PTS、DTS这些参数的。在发送这种数据的时候,需要自己计算并写入AVPacket的PTS,DTS,duration等参数。

基于FFmpeg的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。视音频的复用器(Muxer)和分离器(Demuxer)。将一个FLV封装的文件(其中视频编码为H.264,音频编码为MP3)分离成为两个文件:一个H.264编码的视频码流文件,一个MP3编码的音频码流文件。分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。
 基于FFmpeg的视音频分离器(Simplest FFmpeg demuxer)。视音频分离器(Demuxer)即是将封装格式数据(例如MKV)中的视频压缩数据(例如H.264)和音频压缩数据(例如AAC)分离开。视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。

ffmpeg项目的数据IO部分主要是在libavformat库中实现,某些对于内存的操作部分在libavutil库中。数据IO是基于文件格式(Format)以及文件传输协议(Protocol)的,与具体的编解码标准无关。

FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)相关推荐

  1. 【前端】wangeditor源码修改,打包发布到npm,实现上传视频功能,得到视频的第一帧保存为封面,spring-boot+vue,axios实现文件上传,视频图片浏览

    一.实现 1.创建git分支,clone下源码 git地址 创建分支 2.图片上传具有文件选择的功能,所以我完全模仿(抄袭)图片上传 报错不慌,全部改完就不报错了 1)在src/config/inde ...

  2. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  3. 西门子224XP源码 基于STM32F103RC 支持200软件(STEP7MicroWINV4)下载、上传程序块

    西门子224XP源码 基于STM32F103RC 支持200软件(STEP7MicroWINV4)下载.上传程序块.数据块及系统块:支持监视程序(程序状态监视.状态表监视):支持2/3级密码保护功能. ...

  4. 【FFmpeg】ffmpeg工具源码分析(一):main函数

    ffmpeg工具经常用来转换.生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret ...

  5. 【FFmpeg】ffmpeg工具源码分析(三):分配过滤器内存(宏GROW_ARRAY)详解

    0.引言 在ffmpeg.c源码的核心函数transcode() 中,先执行初始化操作transcode_init() : 首先初始化过滤器filtergraphs,在寻找过滤器在哪分配时,发现它使用 ...

  6. 【FFmpeg】ffmpeg工具源码分析(二):转码核心函数 transcode

    1.转码流程 1)转码前初始化:打开输入输出文件,初始化编码器.解码器.过滤器,创建多线程,设置串口终端等: 2)while循环处理每一包数据,核心函数 transcode_step(稍后分析): 3 ...

  7. android h5 多图上传源码,JS移动端/H5同时选择多张图片上传并使用canvas压缩图片...

    最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候 ...

  8. php支持上传音乐播放网,基于ThinkPHP5框架开发的响应式在线音乐播放网站PHP源码+WAP手机端|在线支付+会员购买+音乐上传...

    源码介绍 基于ThinkPHP5框架开发的响应式在线音乐播放网PHP源码,是一款开源的跨平台音乐管理系统,基于国内最优秀的开源框架ThinkPHP5.0.11内核开发的在线DJ音乐播放分享网站,完全免 ...

  9. 源码下载java利用jquery和smartupload实现头像上传切割效果

    题记:写这篇博客要主是加深自己对源码下载的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 效果图如下: 每日一道理 流逝的日子像一片片凋零的枯叶与花瓣,渐去渐远的是青春的纯情与浪漫 ...

最新文章

  1. 简单数据结构(队列 栈 树 堆 )
  2. 高盛发布区块链报告:从理论到实践(中文版)
  3. Font Manager :字体管理及批量安装工具
  4. 软件质量保证计划_质量保证QA与质量控制QC
  5. ios开发学习-指示器(HUD)效果源码分享
  6. 软件测试管理知识总结
  7. hmcl手机版_hmcl启动器手机版
  8. 酷派大观4 8970 刷android 4.4,酷派5890驱动 酷派 8970L(大观4)recovery卡刷通用刷机教程...
  9. 深度linux新增分辨率,深度Linux Deepin设置分辨率为1920x1080
  10. Windows 最全CMD命令,带死机修复系统命令
  11. word文档怎么生成html,word文档怎么排版
  12. Crackme#1算法注册机
  13. 用 BCDEdit 命令修改 Windows 多系统启动菜单的名称及显示顺序
  14. 关于Axure RP 的授权,我猜你还想知道......
  15. 多多情报通:拼多多卖茶叶需要食品许可证吗?还需要什么证件?
  16. imx6u开发板导入实际应用(一)熟悉开发板,建立调试环境
  17. 暗原色原理去雾matlab代码(Matlab)
  18. google翻译网页不错
  19. c语言函数指针封装函数,C语言之函数指针、回调函数的使用
  20. Waymo二次裁员/特斯拉召回,自动驾驶赛道「新」变化

热门文章

  1. 【PXI 虹科科普文(完结篇)】-- 混合机箱及背板与模块(一定要看到文末哟(^U^))
  2. CloudCC生态软件包开发教程-李育红-专题视频课程
  3. ORACLE视图的修改
  4. 环境监测设备中ESD测试步骤
  5. python表白,用Love组成一朵玫瑰花
  6. spring boot- JdbcTemplate、NamedParameterJdbcTemplate基本使用(批量更新插入)
  7. QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-词法分析(3)【简书被冻结-搬运】
  8. ROS中使用乐视 奥比中光(Astra Pro)深度相机显示彩色和深度图像
  9. 【转帖】应用软件系统架构设计的七种武器
  10. 请查收!顶会AAAI 2020录用论文之知识图谱篇