# 音视频编解码 **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() ```