欢迎star的项目
- 一个cpp文件就可以理解的渲染管线,1000行代码深刻理解渲染管线
- 最快入门的FFmpeg教程 下载即可运行的八个demo 这里下载: https://github.com/wlxklyh/FFMpegStudy
测试视频:
一、Tutorial1——视频截帧保存
https://github.com/wlxklyh/FFMpegStudy/blob/master/win/Tutorial1 这个是9361帧的截图
流程说明: 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
跟Tutorial1大致一致 除了SDL部分 和 Frame编码为YUV 1. SDL部分
SDL_Init
- 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 然后
音频解码流程:
- 查找音频流
- 得到音频流解码器上下文
- 得到音频解码器
- 打开音频解码器
- 帧初始化
- 逐帧得到音频的packet
- 把音频packet塞入队列
- 回调函数audio_callback
- 取出一帧的数据:audio_decode_frame
- 从队列里面取出一个:packetpacket_queue_get
- 音频解码:avcodec_decode_audio4
- 获取音频buff大小:av_samples_get_buffer_size
- 根据buff大小:Frame->data 取出来
- 往音频线程的 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、视频连接:
附
后面学习FFMpeg(win)都从这里拷贝出来 不用管环境和头文件的问题。
欢迎加微信讨论(备注Gituhb)
https://u.wechat.com/MLz38VV_N_mCtcIoBB7Nhls (二维码自动识别)