# 音视频编解码
**Repository Path**: fccyy/audio_video_codec
## Basic Information
- **Project Name**: 音视频编解码
- **Description**: mpeg2, h264, mp3, aac, mkv, mp4编解码
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 35
- **Created**: 2020-07-15
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 音视频格式简介
1. 文件格式
* .mkv
一种容器和文件格式,和AVI MP4 ASF类似
[matroska官网](https://matroska.org/index.html "matroska")
[协议pdf下载地址](https://matroska.org/files/matroska_file_format_alexander_noe.pdf "matroska")
* .mp4
一种容器格式,全名MPEG-4第14部分,协议ISO/IEC 14496-14:2003
[mpeg官网](https://mpeg.chiariglione.org/ "mpeg") (速度很慢,无法下载协议文档)
[协议pdf下载地址](http://www.elecfans.com/soft/162/2008/200808267573.html "elecfans") 注册以后即可下载,无需下载积分
* .mp3
一种音频编码与压缩格式,全称MPEG-1 or MPEG-2 Audio Layer III,ISO/IEC 13818-3 or ISO/IEC 11172-3
[CSDN下载地址](https://download.csdn.net/download/screwshine/3816094 "csdn") 需要下载积分
* .jpg/.jpeg
JFIF格式的文件,JPEG压缩方法,协议ISO/IEC 10918-1
[协议pdf下载地址](https://www.w3.org/Graphics/JPEG/itu-t81.pdf "ITU T.81") 官网免费下载
[CSDN下载地址](https://download.csdn.net/download/mybear0706/7075151 "csdn") 需要下载积分(与上面的文件一致)
* .mjpg/.mjpeg
格式[RFC 2435](https://tools.ietf.org/html/rfc2435)
ITU T.81
[在线阅读](https://wenku.baidu.com/view/f4429ac24028915f804dc27d.html "百度文库")
下载地址见前面.jpeg
2. 编码格式
* mp3
MPEG-1 or MPEG-2 Audio Layer III
ISO/IEC 13818-3 or ISO/IEC 11172-3
协议下载地址见前面.mp3
* aac
AAC由国际标准化组织及国际电工委员会标准化为MPEG-2及MPEG-4规格的一部分。
.aac使用MPEG-2 Audio Transport Stream容器
MPEG-2 AAC和MPEG-4 AAC
ISO/IEC 13818-7 or ISO/IEC 14496-3 (HE-AAC/aac+)
[13818-7下载地址](https://download.csdn.net/download/sinat_15012787/12237536 "csdn") 需要下载积分
[14496-3下载地址](https://download.csdn.net/download/jgf_ntu/4683782 "csdn") 需要下载积分
* h264
全称MPEG-4 Part 10, Advanced Video Coding,ISO/IEC 14496-10:2004
[协议pdf下载地址](https://www.itu.int/rec/T-REC-H.264-201906-I/en "ITU下载地址") 下载速度很慢,但是可以下载成功
* mpeg2
ISO/IEC 13818-1 音视频同步与复用
[13818-1中文版下载地址](https://download.csdn.net/download/louisneon/2752485 "csdn") 需要下载积分
ISO/IEC 13818-2 视频
[138181~3中文版下载地址](http://download.eeworld.com.cn/detail/solarelec/100059 "eeworld") 需要一个下载积分
[13818-2英文版下载地址](https://download.csdn.net/download/michaelkuo8088/531610 "csdn") 需要下载积分
* jpeg
协议ISO/IEC 10918-1 or ITU T.81
下载地址见前面.jpeg
3. 开源编解码器
* ffmpeg
[官网](https://ffmpeg.org/ffmpeg.html "ffmpeg")
[Git仓库](https://github.com/FFmpeg/FFmpeg "FFmpeg")
[WiKi](https://trac.ffmpeg.org/ "ffmpeg")
压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
* bilibili网页播放器
flv.js [Github仓库](https://github.com/bilibili/flv.js.git "flv.js")
* bilibili苹果安卓播放器
ijkplayer [Github仓库](https://github.com/bilibili/ijkplayer "ijkplayer")
* ffserver
ffserver [wiki地址](https://trac.ffmpeg.org/wiki/ffserver "ffserver")
* ffplay
ffplay [官网](https://ffmpeg.org/ffplay.html "ffplay")
使用the FFmpeg libraries and the SDL library。
MediaInfo查看媒体文件信息
[官网](https://mediaarea.net/en/MediaInfo "mediaarea")
[源码](https://sourceforge.net/projects/mediainfo/ "sourceforge")
4. 参考资料
[如何用ffplay播放视频](https://askubuntu.com/questions/750754/how-to-play-video-using-ffmpeg-on-ubuntu)
[ISO/IEC 14496-12:2015(ISO格式) ](https://standards.iso.org/ittf/PubliclyAvailableStandards/c068960_ISO_IEC_14496-12_2015.zip "官网") 官网可免费下载
[ffplay read_thread获取文件信息流程](https://blog.csdn.net/oncealong/article/details/91400671 "csdn")
[ffplay avformat_open_input解封装流程](https://blog.csdn.net/leixiaohua1020/article/details/44064715 "avformat_open_input")
[ffplay probe探测文件格式流程](https://blog.csdn.net/jyt0551/article/details/77018293 "csdn")
[mp4文件格式详解](https://blog.csdn.net/DONGHONGBAI/article/details/84401397 "csdn")
[mkv文件格式详解](https://blog.csdn.net/tx3344/article/details/8162656 "csdn")
[ffplay 视频显示流程](https://blog.csdn.net/dssxk/article/details/50403018 "csdn")
5. ffplay源码分析
```c
// 获取文件封装格式
main() --> stream_open() --> read_thread() --> avformat_open_input() --> init_input()
--> av_probe_input_buffer2() --> av_probe_input_format2() --> av_probe_input_format3()
--> for(){ score = fmt1->read_probe() } // 选出封装格式,如mp4、mkv // AVInputFormat *fmt1
// mp4的read_probe() 是 mov_probe()
```
```c
// 解封装,获取基础的流信息
main() --> stream_open() --> read_thread() --> avformat_open_input()
--> s->iformat->read_header(s) // 获取基本的流信息,如有多少音频和视频,音视频是什么格式
// mp4的read_header() 是 mov_read_header()
```
```c
// 获取流里面的帧
--> ff_read_packet()
--> s->iformat->read_packet(s, pkt)
// mp4的read_packet() 是 mov_read_packet()
```
```c
// 解码
AVCodec *codec
video_thread() --> get_video_frame() --> decoder_decode_frame() --> packet_queue_get() --> avcodec_receive_frame()
--> decode_receive_frame_internal() --> decode_simple_receive_frame() --> decode_simple_internal()
--> avctx->codec->decode()
ffmpeg/libavcodec/mpegaudiodec_float.c decode_frame()
ffmpeg/libavcodec/h264dec.c h264_decode_frame()
```
```c
// 文件操作
//最终的读数据接口 url.h URLProtocol 将数据读到 AVIOContext
main() --> stream_open() --> read_thread() --> avformat_alloc_context()
--> avformat_get_context_defaults() --> io_open_default()
--> ffio_open_whitelist() --> ffurl_open_whitelist()
--> ffurl_connect() --> uc->prot->url_open()
//实际调用的地方是:
read_thread() --> avformat_open_input() --> init_input()
--> s->io_open()
//读取的数据放到AVIOContext中的buffer中
url_open = file_open, //file.c
ffurl_read() ffio_geturlcontext() AVIOContext中read_packet()
```
```c
//数据流通过程
read_probe(AVProbeData.buf) <-- avio_read(AVIOContext.buf_ptr, 2k) <-- AVFormatContext.pb
```
```c
//转码
main() --> transcode() --> transcode_step() --> process_input() --> process_input_packet()
--> do_streamcopy() --> output_packet() --> write_packet() --> av_interleaved_write_frame()
--> write_packets_common() --> write_packet_common() --> write_packet() --> ff_raw_write_packet()
--> avio_write() --> memcpy()
```
6. 额外的网页资料
[mp4数据流结构 《[音视频]mp4相比m3u8第一帧加载较慢的原因?》](https://www.jianshu.com/p/0f1fc8fc2278)
[mp4大部分box详细介绍《mp4封装格式各box类型讲解及IBP帧计算》](https://www.cnblogs.com/ailumiyana/p/12907363.html)
[mkv大部分element详细介绍 《【多媒体封装格式详解】---MKV》cluster/block ](https://www.cnblogs.com/jingzhishen/p/3833402.html)
[《H.264编码格式简单分析》]( https://www.cnblogs.com/jiayayao/p/7086711.html)
[《【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一》 ](https://msd.misuland.com/pd/3065794831805579300)
[《H264码流和Mp4结构详解》](https://blog.csdn.net/qq_36449541/article/details/81485022)
[《H.264码流结构解析》](https://blog.csdn.net/zhuyunier/article/details/79613263)
[!!!《H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流》](https://www.xuebuyuan.com/1695615.html)
[!!!《MP4中提取H.264码流》](https://blog.csdn.net/xiaojun111111/article/details/52135209)
[!!!《【VS开发】MP4与H.264》](https://www.cnblogs.com/huty/p/8518876.html)
[《用ffmpeg从MP4中提取h.264码流》](https://blog.csdn.net/strikedragon/article/details/90108067)
[《H264(NAL简介与I帧判断)》](https://www.cnblogs.com/yjg2014/p/6144977.html)
[《区分mp4格式里面mdat中的音频和视频数据》](https://blog.csdn.net/u013898698/article/details/77337597)
[!!!《MP4 mdat box解析》](https://blog.csdn.net/u013752202/article/details/80557222)
[测试视频下载 ](http://www.rapconverter.com/sample-videos)
[《Mpeg MP4 Container》](https://www.ramugedia.com/mp4-container)
[!!!《mp4所有box详解》](https://wiki.multimedia.cx/index.php/QuickTime_container#mdat)
[!!!《H264码流详细说明》](https://blog.csdn.net/heibao111728/article/details/80354630)
[《H264码流分析》](https://blog.csdn.net/qq_18998145/article/details/99832401)
[AAC 音频格式详解](https://blog.csdn.net/sdsszk/article/details/83997348)
[【多媒体封装格式详解】---MP4【4】](https://www.cnblogs.com/lidabo/p/3754130.html)
[mp4文件格式解析](https://www.jianshu.com/p/529c3729f357)
[ffmpeg命令大全 (保存流)](https://blog.csdn.net/walkeryudev/article/details/94623129)
[Matroska文件解析之SimpleBlock](https://blog.csdn.net/zhangrui_fslib_org/article/details/50758837)
7. ffmpeg源码分析
```c
//打开文件
main() --> ffmpeg_parse_options() --> open_files() -->
--> open_input_file() --> avformat_open_input() --> AVFormatContext *ic
//处理流
--> choose_decoder() --> avformat_find_stream_info()
--> add_input_streams() --> transcode() --> transcode_step()
--> transcode_step() --> transcode_from_filter()
```