FFmpeg
whoyouare888
这个作者很懒,什么都没留下…
展开
-
46.FFmpeg学习笔记 - mp4格式解析
目录MP4相关文档MP4分析工具术语和缩略语Mp4文件的组织结构Box对象结构FullBox对象结构常见的BoxFile Type BoxMovie 结构Movie BoxMovie Header BoxTrack BoxTrack Header BoxMedia BoxMedia Header BoxHandler Referenc...转载 2019-08-31 15:46:40 · 1276 阅读 · 0 评论 -
35.FFmpeg学习笔记 - ffplay源码解读3之读文件
本篇文章看看ffplay是如何读取packet放入队列中的。一、先看入口函数:int main(int argc, char **argv){ VideoState *is; ... av_init_packet(&flush_pkt); flush_pkt.data = (uint8_t *)&flush_pkt; ......原创 2019-07-31 13:45:07 · 882 阅读 · 0 评论 -
34.FFmpeg学习笔记 - ffplay源码解读2之数据结构
本篇分析一下ffplay的数据结构。(1)VideoStateVideoState结构体,正如名字的含义,管理了一些全局的播放状态。typedef struct VideoState { SDL_Thread *read_tid; //读文件线程id AVInputFormat *iformat; //输入格式 /* 丢弃标志,在切换音视频流和关...原创 2019-07-30 13:14:43 · 382 阅读 · 0 评论 -
33.FFmpeg学习笔记 - ffplay源码解读1之概述
学习ffplay也有一段时间了,打算写几篇文章记录一下。ffplay版本:4.1ffplay源码只有3000多行,但是其中包含了音视频播放,前进/后退,暂停/继续,切换音视频流,逐帧播放等功能,可以说比较全面了。ffplay总的简略流程图如下所示:(1)在steam_open()函数中,创建了一个线程read_thread()。在这个线程中,循环调用av_read_frame(...原创 2019-07-29 17:47:18 · 258 阅读 · 0 评论 -
29.FFmpeg学习笔记 - 转码1
本文输入一个音频文件(只有一个音频流),如mp3文件,然后转码成AAC编码格式,并写入任意一个支持AAC格式的封装格式中,如mp4。程序入口函数:transcode_audio().AVAudioFifo结构体用于存储解码的音频数据。#include <stdio.h>#include "libavformat/avformat.h"#include "liba...原创 2019-07-12 12:24:10 · 363 阅读 · 0 评论 -
28.FFmpeg学习笔记 - 用libavfilter转换原始视频格式
本文用libavfilter转换原始视频格式。程序输入一个原始视频文件:yuv文件,yuv420p格式,宽高848x480。输出:rgb文件,rgb24格式,宽高1696x960。#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libavfilter/buff...原创 2019-07-12 08:49:00 · 400 阅读 · 0 评论 -
20.FFmpeg学习笔记 - 带编码的视频复用器(mux)
本篇文章写一个视频复用器。输入一个pcm文件和一个yuv文件。pcm文件格式是f32le,单声道,采样率是48000。yuv文件格式是yuv420p,848x400。读入两个文件,分别进行音频和视频编码,然后mux成目标文件,比如xxx.mp4。代码中选择了编码2声道的音频,由于输入的pcm是单声道,所以代码中简单复制了pcm的数据到frame->data[1]中。#inc...原创 2019-07-06 17:59:17 · 1239 阅读 · 0 评论 -
27.FFmpeg学习笔记 - 用libswscale转换原始视频格式
本文用libswscale转换原始视频格式。程序输入一个原始视频文件:yuv文件,yuv420p格式,宽高848x480。输出:rgb文件,rgb24格式,宽高1696x960。#include <libavutil/imgutils.h>#include <libavutil/parseutils.h>#include <libswscale/swscal...原创 2019-07-11 12:56:49 · 248 阅读 · 0 评论 -
12.FFmpeg学习笔记 - aac&adts解析
1.ADTSADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式。一般的AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。ADTS头分为固定头信息和可变头信息两个部分,固定头信息在每个帧中的是一样的...原创 2019-07-01 13:23:36 · 1472 阅读 · 0 评论 -
11.FFmpeg学习笔记 - 解复用分离aac码流
上一篇文章,是分离视频文件里的mp3音频码流,分离出来后是可以直接播放的。但是对于aac编码的音频,直接分离aac码流是不一定能播放的。如果视频复用格式是TS,则直接存储AVPacket的data是可以播放的。如果是mp4/flv/mkv等格式则不行,因为调用av_read_frame()后得到的AVPacket里面的内容是AAC纯数据,就是那种不包含ADTS文件头的AAC数据。本以为仿...原创 2019-07-01 12:50:34 · 1108 阅读 · 0 评论 -
31.FFmpeg学习笔记 - iOS上解码视频并播放(暂无声音)
本文目标:输入一个视频文件,然后播放视频画面(暂时不播放声音)。主要结合前面写的几篇文章,进行播放:15.FFmpeg学习笔记 - 解复用和解码(新的解码API)27.FFmpeg学习笔记 - 用libswscale转换原始视频格式10.OpenGL学习笔记 - 在iOS上播放YUV程序流程是:先解码,然后将视频格式转换为YUV420P格式,最后用OpenGL在iOS上播放出来...原创 2019-07-22 17:07:40 · 588 阅读 · 0 评论 -
32.FFmpeg学习笔记 - iOS上播放PCM
本文打算用iOS上的Audio Unit来播放PCM文件。文章当中用的Remote I/O Unit类型,下面是官方的一张示意图:从图中可以看到,两个element都包含输入输出两个端。element0的输出端(output scope)对应的是扬声器,输入端用于输入数据,可以从element1的输出端获取,也可以从其他Unit或文件获取。element1的输入端表示麦克风,ele...原创 2019-07-23 13:18:50 · 908 阅读 · 0 评论 -
36.FFmpeg学习笔记 - ffplay源码解读4之解码线程
本篇说一下解码线程。在stream_component_open函数中,分别创建了一个视频解码线程和音频解码线程:static int stream_component_open(VideoState *is, int stream_index){ ... switch (avctx->codec_type) { case AVMEDIA_TYP...原创 2019-08-01 15:07:46 · 388 阅读 · 0 评论 -
45.FFmpeg学习笔记 - ts格式解析2
如下图所示 用UltraEdit打开的一个TS流,我们发现每隔188个字节就有一个47(可以看做是包头)TS的包头占用四个字节以第一个包为例:47 60 00 1000 00 B0 0D 00 00 C1 00 00 00 01 E081 0C 8C BE 32 FF FF ……………………………..…………………………………………………………………………………………………...转载 2019-08-29 15:12:33 · 510 阅读 · 0 评论 -
44.FFmpeg学习笔记 - ts格式解析1
ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息注: 详...转载 2019-08-29 15:02:24 · 932 阅读 · 0 评论 -
43.FFmpeg学习笔记 - flv格式解析
一、flv文件结构flv文件由flv header 和flv body组成。二、flv headerHeader 部分记录了FLV的类型、版本、流信息、Header 长度等。一般整个Header占用9个字节,大于9个字节则表示头部信息在这基础之上还存在扩展数据。Header 的头部信息排布如下所示:三、flv bodyBody 是由一个个Tag组成的,每个Tag下面有一...转载 2019-08-27 14:31:50 · 1854 阅读 · 0 评论 -
41.FFmpeg学习笔记 - iOS硬编码pcm到aac
前文12.FFmpeg学习笔记 - aac&adts解析讲过aac格式,本篇文章用iOS平台的AudioToolbox框架硬编码AAC。1.编码aac,需要输入pcm数据,一般从麦克风获取,所以本文用AVCaptureSession从麦克风获取原始音频pcm数据。- (void)startCapture { self.mCaptureSession = [[AVCapt...原创 2019-08-23 11:56:57 · 1106 阅读 · 0 评论 -
40.FFmpeg学习笔记 - iOS硬解码h264
解码过程1.输入一个h264文件,nalu以0x00000001分隔,解析h264文件,然后将0x00000001四个字节替换成nalu长度 //将NALU的开始码替换成NALU的长度信息,长度固定4个字节 uint32_t nalSize = (uint32_t)(_packetSize - 4); uint32_t *pNalSize = (uint32_t *...原创 2019-08-22 14:28:29 · 917 阅读 · 0 评论 -
42.FFmpeg学习笔记 - iOS硬解码aac
本文通过用AudioQueue来播放AAC,其内部会自动进行解码。可以设置AudioQueue用硬解码还是软解码。AudioQueue播放步骤如下:1、给buffer填充数据,并把buffer放入就绪的buffer queue; 2、应用通知队列开始播放; 3、队列播放第一个填充的buffer; 4、队列返回已经播放完毕的buffer,并开始播放下面一个填充好的buffer; 5、...原创 2019-08-23 17:10:41 · 620 阅读 · 0 评论 -
39.FFmpeg学习笔记 - iOS硬编码视频到h264
一、概述硬编码使用场景通常是从摄像头采集图像数据,然后利用系统提供的接口进行硬编码。从摄像头采集数据用的是AVFoundation框架,硬编码用的是iOS 8开放的VideoToolbox框架。二、用AVFoundation采集数据用AVFoundation采集摄像头的数据步骤基本固定,下面详细说一说:1.初始化会话,并设置摄像头采集图像的分辨率 //初始化会话 ...原创 2019-08-14 18:53:12 · 3047 阅读 · 0 评论 -
38.FFmpeg学习笔记 - ffplay移植到iOS
用了几天的时间,将ffplay(4.1版本)移植到了iOS平台,并保留了绝大部分功能。ffplay播放视频和音频用的是SDL库提供的功能,本项目用OpenGL播放视频,用AudioUnit播放音频,可以参考前面的两篇文章:32.FFmpeg学习笔记 - iOS上播放PCM10.OpenGL学习笔记 - 在iOS上播放YUV为了方便,播放视频时只支持YUV420P格式,否则需要进行转...原创 2019-08-08 14:46:31 · 792 阅读 · 1 评论 -
37.FFmpeg学习笔记 - ffplay源码解读4之音视频同步
本文只分析视频同步到音频。前面文章说到main函数中的event_loop函数,此函数用来处理键盘、鼠标事件以及显示视频帧。static void event_loop(VideoState *cur_stream){ SDL_Event event; double incr, pos, frac; for (;;) { double ...原创 2019-08-01 17:37:18 · 205 阅读 · 0 评论 -
10.FFmpeg学习笔记 - 解复用分离mp3码流
本篇文章目标是给定一个视频文件(mp4/flv/ts/mkv),从中分离出mp3码流。void demux(void){ const char *src_filename = "/Users/zhw/Desktop/resource/sintel_h264_mp3.mkv"; const char *audio_dst_filename = "/Users/zhw/Desk...原创 2019-07-01 11:06:53 · 251 阅读 · 0 评论 -
9.FFmpeg学习笔记 - 解复用分离h264码流2
上一篇文章,是分离ts格式里的h264码流,分离出来后是可以直接播放的。但是对于mkv/flv/mp4等格式,直接分离h264码流是不能直接播放的,因为AVPacket的data里只包含视频压缩数据,并不包含pps,sps信息,也没有0x00000001和0x000001分隔符,没有这些信息,单凭h264码流是无法解码播放的。H.264码流的SPS和PPS信息存储在AVCodecContext...原创 2019-07-01 08:44:49 · 1162 阅读 · 0 评论 -
8.FFmpeg学习笔记 - 解复用分离h264码流1
本篇文章目标是给定一个ts封装格式的文件,从中分离出h264视频码流。void demux(void){ const char *src_filename = "/Users/zhw/Desktop/sintel.ts"; const char *video_dst_filename = "/Users/zhw/Desktop/sintel.h264"; ...原创 2019-06-30 14:13:36 · 665 阅读 · 1 评论 -
30.FFmpeg学习笔记 - 转码2
本文输入一个视频文件,如mp4,进行解封装、解码、filtering、编码、封装,最后合成一个新的封装格式文件如flv。音频、视频的编码格式和解码时的一致。解码时,AVFrame的pts是AVStream对time base。编码时要把pts转成编码AVCodecContext的time base。编码后得到的packet的pts、dts、duration要转成输出流AVStream的ti...原创 2019-07-12 17:47:54 · 494 阅读 · 0 评论 -
14.FFmpeg学习笔记 - 解复用和解码之函数说明
上一篇文章贴出了解复用和解码的相关代码,这一篇文章说说相关的函数。一、视频本篇仅以解码后为YUV420 planar格式加以说明。一个视频文件,比如宽为width,高为height。那么解码后YUV在内存中排列方式如下图:其中每一行Y宽度为width,Y的行数为height,U的宽度为width/2,高度为height/2,V和U一样,这是由YUV420 planar所决定的。...原创 2019-07-03 14:45:32 · 352 阅读 · 0 评论 -
13.FFmpeg学习笔记 - 解复用和解码(旧的解码API)
本篇文章,输入一个视频文件,分离出解码后的音视频数据,然后分别写入文件当中。入口是:demux_decode函数。下一篇文章会对以下代码中的一些关键函数做以说明。#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale....原创 2019-07-03 13:42:38 · 742 阅读 · 0 评论 -
23.FFmpeg学习笔记 - 解封装之自定义IO
通常解封装时,当调用avformat_open_input和avformat_find_stream_info时,FFmpeg内部会自动读取文件内容来查找信息。本文要做的是,自定义IO,提供一个回调函数。这样的话,当调用前面这两个函数时,通过回调函数来提供数据。#include <libavcodec/avcodec.h>#include <libavformat/avf...原创 2019-07-08 17:16:28 · 713 阅读 · 0 评论 -
4.FFmpeg学习笔记 - H.264格式解析1
一、h.264码流分为两种格式:字节流格式和RTP包格式。(1)字节流格式:这是在h264官方协议文档中规定的格式,处于文档附录B(Annex-B Byte stream format)中。所以它也成为了大多数编码器,默认的输出格式。它的基本数据单位为NAL单元,也即NALU。为了从字节流中提取出NALU,协议规定,在每个NALU的前面加上起始码:0x000001或0x00000001(0x代...原创 2019-06-27 11:49:30 · 498 阅读 · 0 评论 -
22.FFmpeg学习笔记 - 封装格式转换(remux)
本篇文章的封装格式转换和上篇文章21.FFmpeg学习笔记 - 无编码的视频复用器(mux)其实差不多,只不过是,转换格式输入的是一个文件,从中找到所有的视频流和音频流,然后mux成一个视频文件。过程中也不用调用av_compare_ts来比较时间,因为输入的是一个文件(视频流和音频流已交错排列好),读到什么,就写什么即可。#include <libavutil/timesta...原创 2019-07-08 14:57:23 · 914 阅读 · 0 评论 -
21.FFmpeg学习笔记 - 无编码的视频复用器(mux)
本篇文章的视频复用器是不带编码的。程序输入两个文件,从其中一个文件挑出视频流,从另一个文件挑出音频流,然后合成为某种视频格式(如mp4/ts/flv等),输出成文件。其中视频流所在的文件,可以是mp4/ts/flv等格式的视频文件,也可以是h264等纯视频编码文件。音频流所在文件可以是mp4/ts/flv等格式的视频文件,也可以是aac等纯音频编码的文件。#include <s...原创 2019-07-08 13:28:06 · 1034 阅读 · 0 评论 -
3.FFmpeg学习笔记 - H.264基本概念
I帧:I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)P帧:P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)B帧:B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前...原创 2019-06-17 17:30:31 · 212 阅读 · 0 评论 -
2.FFmpeg学习笔记 - PCM
一、基本概念PCM(Pulse Code Modulation)也被称为脉码编码调制,PCM中的声音数据没有被压缩,是原始的音频采样数据。通常说的44100HZ 16bit,表示采样率是44100HZ,位深是16bit,也即每秒钟有 44100 次采样,每声道每个采样数据用 16 位(2字节)记录。很显然,用16位记录数据比用8位能记录的数据范围更大,更精细,也就听起来更逼真。双声道...原创 2019-06-09 16:37:15 · 394 阅读 · 0 评论 -
5.FFmpeg学习笔记 - H.264格式解析2
1)NALU的主体涉及到三个重要的名词,分别为EBSP、RBSP和SODB。其中EBSP完全等价于NALU主体,而且它们三个的结构关系为:EBSP包含RBSP,RBSP包含SODB。其中SODB就是最原始的编码数据。在h264的文档中,并没有EBSP这一名词出现,但是在h264的官方参考软件JM里,却使用了EBSP。2)EBSP相较于RBSP,多了防止竞争的一个字节:0x03...原创 2019-06-28 15:10:14 · 435 阅读 · 0 评论 -
6.FFmpeg学习笔记 - H.264格式解析之封装格式
由于NAL的语法中没有给出长度信息,实际的传输、存储系统需要增加额外的头实现各个NAL单元的定界。其中,AVI文件和MPEG TS广播流采取的是字节流的语法格式,即在NAL单元之前增加0x00000001或0x000001的同步码。而对于MP4文件,NAL单元之前没有同步码,却有若干字节的长度码,来表示NAL单元的长度,这个长度码所占用的字节数由MP4文件头给出;此外,从MP4读出来的视频帧不...原创 2019-06-28 16:08:34 · 291 阅读 · 0 评论 -
15.FFmpeg学习笔记 - 解复用和解码(新的解码API)
本文代码对应的是13.FFmpeg学习笔记 - 解复用和解码(旧的解码API),用的是新的解码API。#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>#include <libavutil/imguti...原创 2019-07-04 09:30:31 · 967 阅读 · 0 评论 -
FFmpeg学习笔记系列
FFmpeg学习笔记系列是在Mac上用xcode调试的,所用ffmpeg版本是:4.0.2建议在命令行安装FFmpeg和ffplay,命令为:brew install ffmpeg --with-ffplay如有需要编译好的库文件,以下是下载地址:https://download.csdn.net/download/whoyouare888/11200878资源文件下载地址:...原创 2019-06-30 13:47:27 · 371 阅读 · 0 评论 -
19.FFmpeg学习笔记 - 编码视频
本篇文章编码视频。输入一个原始未编码的yuv文件,格式为yuv420p,宽高848*480,将其编码为h264格式。#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>#include <libavutil/...原创 2019-07-05 11:20:42 · 299 阅读 · 0 评论 -
26.FFmpeg学习笔记 - 用libswresample转换原始音频格式
本文用libswresample转换原始音频格式。程序输入一个原始音频文件:pcm格式,采样率48000,2声道,AV_SAMPLE_FMT_FLT格式。输出:pcm格式,采样率44100,1声道,AV_SAMPLE_FMT_S16P格式。#include <libavutil/opt.h>#include <libavutil/channel_layout.h>...原创 2019-07-10 16:22:44 · 431 阅读 · 1 评论