欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > FFMPEG解码+SDL2播放视频

FFMPEG解码+SDL2播放视频

2025/2/23 20:09:58 来源:https://blog.csdn.net/qq_43424630/article/details/144772604  浏览:    关键词:FFMPEG解码+SDL2播放视频

FFMPEG解码+SDL2播放

本项目通过FFmpeg对音视频进行解码,得到原始数据格式AVFrame,再通过SDL2在窗口渲染图像数据进行播放。

配置环境:vs 2022 + FFmpeg5.0 + SDL2 2.28

项目源码:https://github.com/say-Hai/FFmpeg-videoPlayDemo/tree/PlaySDL2

附录1:FFMPEG解码调用API流程

图片

附录2:SDL2库播放调用API流程

图片

关键代码:

///初始化ffmpeg相关结构体
int init_ffmpeg(FFmpeg_V_Param* p_ffmpeg_param, const char* filePath)
{//AVFormatContext初始化p_ffmpeg_param->pFormatCtx = avformat_alloc_context();//解码器const AVCodec* pcodec = NULL;//1.初始化网络//av_register_all()已被弃用avformat_network_init();//2.open输入流int ret = avformat_open_input(&(p_ffmpeg_param->pFormatCtx), filePath, NULL, NULL);if (ret < 0){output_log(LOG_ERROR, "avformat_open_input error");return -1;}//3.读取媒体的数据包以获取具体的流信息,如媒体存入的编码格式。ret = avformat_find_stream_info(p_ffmpeg_param->pFormatCtx, NULL);if (ret < 0){output_log(LOG_ERROR, "avformat_find_stream_info error");return -1;}//4.遍历 FFmpeg 中 AVFormatContext 的所有媒体流//get video pCodecParms, codec and frame rate//nb_streams 表示多媒体文件或流中包含的媒体流的数量for (int i = 0; i < p_ffmpeg_param->pFormatCtx->nb_streams; i++){//4.1AVStream:存储音频流或视频流的结构体AVStream* pStream = p_ffmpeg_param->pFormatCtx->streams[i];if (pStream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){//4.2查找匹配解码器ID的已注的解码器pcodec = avcodec_find_decoder(pStream->codecpar->codec_id);//4.3 分配并初始化 AVCodecContext 结构体(参数为编解码器)p_ffmpeg_param->pCodecCtx = avcodec_alloc_context3(pcodec);avcodec_parameters_to_context(p_ffmpeg_param->pCodecCtx, pStream->codecpar);//4.4计算视频的帧率g_frame_rate = pStream->avg_frame_rate.num / pStream->avg_frame_rate.den;//流的索引p_ffmpeg_param->video_index = i;}}if (!p_ffmpeg_param->pCodecCtx){output_log(LOG_ERROR, "could not find video codecCtx");return -1;}//5 通过给定的AVCodec来初始化一个视音频编解码器的 AVCodecContextret = avcodec_open2(p_ffmpeg_param->pCodecCtx, pcodec, NULL);if (ret < 0){output_log(LOG_ERROR, "avcodec_open2 error");return -1;}//6初始化一个缩放上下文 (SwsContext),以便进行视频像素格式的转换或尺寸缩放。(这里是转成YUV420P)p_ffmpeg_param->pSwsCtx = sws_getContext(p_ffmpeg_param->pCodecCtx->width, p_ffmpeg_param->pCodecCtx->height, p_ffmpeg_param->pCodecCtx->pix_fmt,p_ffmpeg_param->pCodecCtx->width, p_ffmpeg_param->pCodecCtx->height, AV_PIX_FMT_YUV420P,SWS_BICUBIC, NULL, NULL, NULL);/**打印将媒体文件的格式和流信息av_dump_format(p_ffmpeg_param->pFormatCtx, p_ffmpeg_param->video_index, filePath, 0);*/return 0;//ffmpeg初始化全部完成
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词