音视频基础
Posted 海岸星的清风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频基础相关的知识,希望对你有一定的参考价值。
音视频基础
资料
- 压箱底的音视频学习资料以及面经整理 (qq.com)
- Android 音视频开发学习思路 - 灰色飘零 - 博客园 (cnblogs.com)
- FFMPEG视音频编解码零基础学习方法_雷霄骅的博客-CSDN博客_ffmpeg 雷晓华
- 播放器技术分享(1):架构设计 - 知乎 (zhihu.com)
- 从开发小白到音视频专家 - 知乎 (zhihu.com)
- Android 音视频开发入门指南 - 知乎 (zhihu.com)
- githubhaohao/LearnFFmpeg: Android FFmpeg 音视频开发教程
- 0voice/audio_video_streaming: 音视频流媒体权威资料整理,500+份文章,论文,视频,实践项目,协议,业界大神名单。 (github.com)
- huimingli/QTFFmpegSDLPlayer: 使用ffmpeg做的播放器 (github.com)
- CarGuo/GSYVideoPlayer: 视频播放器(IJKplayer、ExoPlayer、MediaPlayer) (github.com)
- yangchong211/YCVideoPlayer (github.com)
- FFmpeg简易播放器的实现1-最简版 - 叶余 - 博客园 (cnblogs.com)
- ffplay源码分析1-概述 - 叶余 - 博客园 (cnblogs.com)
FFMPEG基础
SDL基础
FFmpeg和SDL实现视频播放器
视频播放
-
函数说明
-
avformat_open_input
:打开视频文件:读取文件头,将文件格式信息存储在"fmt context"中; -
avformat_find_stream_info
:搜索流信息:读取一段视频文件数据,尝试解码,将读取到的流信息填入pFormatCtx->streams; -
avcodec_find_decoder
:利用解编码器的id获取解解码器; -
avcodec_open2
:编解码器的初始化; -
调用
av_read_frame()
从输入文件中读取视频数据包,调用avcodec_send_packet()
和avcodec_receive_frame()
对视频数据解码。 -
图像格式转换的目的,是为了解码后的视频帧能被 SDL 正常显示,因为FFmpeg解码后得到的图像格式不一定就能被SDL支持,这种情况下不作图像转换是无法正常显示的。
-
定时刷新线程 + 解码主线程,定时刷新线程按计算出的帧率发送自定义 SDL 事件,通知解码主线程。解码主线程收到 SDL 事件后,获取一个视频帧解码并显示。
-
codec:编解码器,对应数据结构 AVCodec。编码器将未压缩的原始图像或音频数据编码为压缩数据。解码器与之相反。
-
codec context:编解码器上下文,对应数据结构 AVCodecContext。此为非常重要的一个数据结构,后文分析。各API大量使用 AVCodecContext 来引用编解码器。
-
codec par:编解码器参数,对应数据结构 AVCodecParameters。新版本增加的字段。新版本建议使用 AVStream->codepar 替代 AVStream->codec。
-
packet:经过编码的数据包,对应数据结构 AVPacket。通过 av_read_frame() 从媒体文件中获取得到的一个 packet 可能包含多个(整数个)音频帧或单个视频帧,或者其他类型的流数据。
-
frame:未编码的原始数据帧,对应数据结构 AVFrame。解码器将 packet 解码后生成 frame。
-
plane:如 YUV 有 Y、U、V 三个 plane,RGB 有 R、G、B 三个 plane。
音频播放
此处指播放视频文件里面的音频,即仅播放视频文件中的声音,而不显示图像。
注意:
- 一个音频 packet 中含有多个完整的音频帧,此函数每次只返回一个 frame,当 avcodec_receive_frame() 指示需要新数据时才调用 avcodec_send_packet() 向编码器发送一个 packet;
- 音频 frame 中的数据格式未必被 SDL 支持,对于不支持的音频 frame 格式,需要进行重采样,转换为 SDL 支持的格式声音才能正常播放;
- 解码器内部会有缓冲机制,会缓存一定量的音频帧,不冲洗(flush)解码器的话,缓存帧是取不出来的,未冲洗(flush)解码器情况下,avcodec_receive_frame() 返回 AVERROR(EAGAIN),表示解码器中改取的帧已取完了(当然缓存帧还是在的),需要用 avcodec_send_packet() 向解码器提供新数据;
- 文件播放完毕时,应冲洗(flush)解码器。冲洗(flush)解码器的方法就是调用 avcodec_send_packet(…, NULL),然后按之前同样的方式多次调用 avcodec_receive_frame() 将缓存帧取尽。缓存帧取完后,avcodec_receive_frame() 返回 AVERROR_EOF。
视频播放原理
从**解复用器(Media Extractor、AVFormatContetext->stream)**开始,会有两个线程分别负责解析音频和视频。
视频录制原理
音频:PCM->ACC数据,视频:YUV->H264,音视频封装:FLV / MP4。
视频基础
I帧是一个关键帧,能够独立解码并显示画面,可指定I帧出现的频率。
常用的是H264。
音频基础
开源项目
编程必备基础-音视频小白系统入门课
编程必备基础-音视频小白系统入门课
普适所有方向程序员,系统补足你缺乏的音视频基础知识
5G 的商用,使高效高清的直播和视频成为刚需,短视频、娱乐直播等都与音视频联系紧密,各大互联网公司都在储备音视频方向的开发者。但是,网络上关于音视频的学习资料非常少,且几乎没有系统讲解音视频的入门课程。于是这门课应运而生。它系统讲解音视频基础原理,并实战如何从0构建一套可商用的娱乐直播系统。无论你从事哪个方向的开发工作,只要对音视频感兴趣,这门课程便能满足你的需求。
第1章 课程导学与准备工作
本章主要介绍为何要带大家学习一个音视频初级入门课程,本课程中不仅系统的讲解了音视频到底是如何工作的,还会将音视频原理与实战相结合,讲解学习阶梯和实现思路,之后会为大家介绍本课程内容具体安排,最后给出如何学好这门课程的一些学习建议。希望大家都能通过这门课程,学有所成,学有所归。...
第2章 音视频环境基础
本章会讲解学习音视频课程之前必要的基础知识,如Linux常见命令以及环境变量的设置等。在之前的课程中,有很多同学提出的问题都是Linux的基础知识问题,尤其是在Windows下工作的同学,因此这部分知识对于 Windows 同学来说至关重要。...
第3章 在不同的系统上编译 ffmpeg
本章会讲解在不同操作系统下如何编译安装ffmpeg,重点是讲解 Windows下编译 ffmpeg的方法等。实际上,在Windows上编译 ffmpeg 一直是一个难点,有很多同学都卡在这个问题上,因此通过本章节的内容就可以轻松解决你的问题。
第4章 C语言回顾
本章会带领大家回顾C语言必要的基础知识,重点讲解C语言中的指针等难点内容,帮助大家为后续学习开发做好准备。
第5章 音频基础知识
本章将带大家学习音频的基本原理(如声音是如何产生的,模拟信号是如何转为数字信号、音频的三要素等信息)。这些信息的掌握,对大家今后处理音频相关的问题时有切实的帮助,如当你播放PCM数据时声音不对,那一定是采样率、采样大小或通道数没有设置正确的原因。...
第6章 【实战】音频采集
本章向你介绍了如何通过ffmpeg API进行音视频数据采集。在讲解过程中,将手把手的带着你编写每一行代码,并对每个用到的 API 参数做了详细介绍。在本章的最后,你还将看到如何将采集到的音频数据录制成文件。相信这对有录制要求的同学也会有很大帮助。...
第7章 音频编码原理
本章向你介绍多种音频编码器(如 AAC, OPUS, speex等),并对各种不同的编码器进行比较,并在众多的编码器中重点向你介绍了 AAC 编码的以及它的不同级别的特性,同时还向你介绍了 AAC 数据头(ADTS) 的详细格式。
第8章 【实战】音频编码
本章以AAC编码为例,向你详细介绍了如何对PCM数据进行重采样以达到AAC 编码的要求,然后讲解了如何通过ffmpeg获取AAC编码器,如何设置编码参数,并最终实现编码的过程。在本章的最后,还将向你详细的介绍如何对代码进行优化以达到更好的编码风格。...
第9章 视频基础知识
本章将讲解视频的基础知识(像素、RGB、分辨率等)、视频帧(图像)与显示器之间的关系。重点讲解YUV数据格式(如YUV4:4:4?YUV4:2:2?YUV4:2:0等),并让你掌握 YUV 与RGB 之间的转换以及视频未编码码流该如何计算。
第10章 H264编码原理
本章将介绍H264 的编码原理,这部分是本门课中最关键的知识点,通过本章的内容你不仅可以知道H264是如何对视频进行编码的,还可以了解H264的数据结构。通过这些知识的学习,你就可以解决很多常见的视频疑难问题,例如为什么播放器可以知道视频的分辨率,为什么视频会出现花屏,为什么会出现卡顿等等。...
第11章 【实战】视频编码/解码
本章将重点介绍如何对采集到的视频数据进行H264编码。同理,只要你学会了如何进行 H264编码,就会知道 H265/VP8/VP9如何进行编码。除此之外,你还将了解一些H264的重要编码参数,在不同的应用场景中掌握该用怎样的参数,这在我们实际工作中是至关重要的。...
第12章 【实战】RTMP传输
在本章中你将首先详细了解 RTMP/FLV协议,然后利用librtmp 开源库将之前编码好的音频数据(AAC)与 编码好的视频数据(H264)生成 RTMP 流并推送到 CDN 流媒体服务器上,从而实现真正的娱乐直播。
第13章 【实战】CDN 实现商业娱乐直播
在本章中我们将按照由浅入难的顺序,即先介绍nginx实现流媒体服务器,然后讲解 SRS 实现流媒体服器,最后讲解在真正的商用产品中是如何通过 CDN云服务来实现大并发,通过本章的学习,你开发的产品将从 Demo 升级为真正可用的产品。...
第14章 课程总结
本章将带大家回顾总结课程重点难点,在课程问答区李超老师等着与你进一步交流,有问题欢迎大家到课程问答区提问。
以上是关于音视频基础的主要内容,如果未能解决你的问题,请参考以下文章