ffmpeg从入门到精通 下载_最快入门的FFmpeg教程(下载即可用)

3edc95741539c56c5c31a2bb00d6b921.png

欢迎star的项目

  • 一个cpp文件就可以理解的渲染管线,1000行代码深刻理解渲染管线
  • 最快入门的FFmpeg教程 下载即可运行的八个demo 这里下载: https://github.com/wlxklyh/FFMpegStudy

测试视频:

87e3bbb8e1d7b9e2d7956b120a9f97f3.png

一、Tutorial1——视频截帧保存

https://github.com/wlxklyh/FFMpegStudy/blob/master/win/Tutorial1 这个是9361帧的截图

aafd82d5461d854deb49c70717094c6a.png

流程说明: 1. 初始化 av_register_all() AVFormatContext pFormatCtx = avformat_alloc_context() 2. 打开文件(会读取header) avformat_open_input(pFormatCtx,filepath) 3. 检查和获取流信息的API avformat_find_stream_info() av_dump_format() 4. 从pFormatCtx中得到那个streamsindex是视频流 pFormatCtx->stream[i]->codec->codec_type == ACMEIDIA_TYPE_VIDEO 5. 从视频流里面得到CodeContext 编解码上下文 6. 从而得到解码器 7. 读取帧 av_read_frame 得到avpacket(存储的可能是视频流 也可能是音频流) 8. 判断avpacket是不是视频流 9. 从读取出的avpacket中读取AVFrame出来 10. 用sws_scale转AVFrame的格式 大多可能是YUV 我们要转成RGB保存 11. SaveFrame fwrite(frame->data[0]+pFrame->linesize[0],1,width*3,pFile)

#include 

二、Tutorial2——视频显示到屏幕(SDL)

https://github.com/wlxklyh/FFMpegStudy/blob/master/win/Tutorial2

35f9fa14772076480bca0728ab5db2dd.gif

跟Tutorial1大致一致 除了SDL部分 和 Frame编码为YUV 1. SDL部分

SDL_Init
  1. Frame编码为YUV 注意Frame的初始化 格式是PIX_FMT_YUV420P avpicture_get_size(PIX_FMT_YUV420P, avcodecContext->width, avcodecContext->height); sws_scale 转换的时候格式是PIX_FMT_YUV420P

流程说明: 1. 初始化编码器库 2. 打开视频文件 avformat_open_input 3. 查找视频流 pFormatCtx->stream[i]->codec_type == VEDIO 4. 得到解码器上下文 pFormatCtx->stream[vedioIndex]->codec 5. 得到解码器 avcode_find_decoder(avVideoCondecCtx) 6. 打开解码器 avcode_open 7. 帧初始化 AVFrame avpicture_fill 8. SDL初始化 SDL_Surface SDL_Overlay 9. 初始化一个packet av_new_packet 10. 逐帧读取 av_rean_frame 1. 如果是视频流avcodec_decode_video 解码 2. 转换上下文 swscontext 3. sws_scale转换成NowYUVFrame 4. 赋值SDL_Overlay 5. 显示SDL_DisplayYUVOverlay

#include 

三、Tutorial3——播放音频

https://github.com/wlxklyh/FFMpegStudy/blob/master/win/Tutorial3 播放视频的代码请看Tutorial2这里只说播放音频的

跟播放视频不一样的地方: 1. 要解码音频 然后塞入到一个队列 2. 读取音频的是在另外一个线程的回调 所以主线程是生产者(生产packet)、音频线程是消费者(消耗packet) 3. 主线程解码音频的过程跟解码视频的类似 逐帧解码后塞入队列packet_queue_put 4. 回调是异步线程需要取队列packet_queue_get 然后

音频解码流程:

  1. 查找音频流
  2. 得到音频流解码器上下文
  3. 得到音频解码器
  4. 打开音频解码器
  5. 帧初始化
  6. 逐帧得到音频的packet
  7. 把音频packet塞入队列
  8. 回调函数audio_callback
  9. 取出一帧的数据:audio_decode_frame
    1. 从队列里面取出一个:packetpacket_queue_get
    2. 音频解码:avcodec_decode_audio4
    3. 获取音频buff大小:av_samples_get_buffer_size
    4. 根据buff大小:Frame->data 取出来
  10. 往音频线程的 stream赋值
#include 

四、Tutorial4、5、6、7——创建线程、同步视频、同步音频、快进

先看着代码: https://github.com/wlxklyh/FFMpegStudy/blob/master/win/Tutorial456

引用

1、雷神的FFMpeg最小demo https://blog.csdn.net/leixiaohua1020/article/details/10528443

2、FFmpeg Tutorial.pdf 中文翻译文档 https://github.com/wlxklyh/FFMpegStudy/blob/master/FFmpeg%20Tutorial.pdf

3、视频连接:

87e3bbb8e1d7b9e2d7956b120a9f97f3.png

后面学习FFMpeg(win)都从这里拷贝出来 不用管环境和头文件的问题。

欢迎加微信讨论(备注Gituhb)

https://u.wechat.com/MLz38VV_N_mCtcIoBB7Nhls (二维码自动识别)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。 解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。 解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。 视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。 接下来的几节我们将会列出主要的流媒体协议,封装格式,以及视音频编码标准。更详细的比较可以参考: 视频参数(流媒体系统,封装格式,视频编码,音频编码,播放器)对比 有关本文中涉及到的协议数据、封装格式数据、视频编码数据、音频编码数据、视频像素数据、音频采样数据的分析可以参考下面系列文章:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值