• 大小: 11.04MB
    文件类型: .7z
    金币: 2
    下载: 0 次
    发布日期: 2024-01-30
  • 语言: 其他
  • 标签: ffmpeg  播放器  

资源简介

FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。 该播放器代码十分简单,只有约100行左右。但是几乎包含了使用FFMPEG播放一个视频所有必备的API,并且使用SDL显示解码出来的视频。十分适合新手学习FFmpeg。 使用了2014.5.6编译的类库,支持最新的HEVC以及VP9.

资源截图

代码片段和文件信息

/* 
 *最简单的基于FFmpeg的播放器
 *Simplest FFmpeg Player
 *
 *雷霄骅 Lei Xiaohua
 *leixiaohua1020@126.com
 *中国传媒大学/数字电视技术
 *Communication University of China / Digital TV Technology
 *http://blog.csdn.net/leixiaohua1020
 *
 *本程序实现了视频的解码和播放。
 *支持最新的HEVC和VP9
 */


#include “stdafx.h“

int _tmain(int argc _TCHAR* argv[])
{
AVFormatContext *pFormatCtx;
int i videoindex;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
char filepath[]=“src01_480x272.vp9“;
//char filepath[]=“cuc_ieschool1.flv“;
//char filepath[]=“src01_480x272_22.hm10“;
av_register_all();
avformat_network_init();
pFormatCtx = avformat_alloc_context();

if(avformat_open_input(&pFormatCtxfilepathNULLNULL)!=0){
printf(“Couldn‘t open input stream.(无法打开输入流)\n“);
return -1;
}
if(av_find_stream_info(pFormatCtx)<0)
{
printf(“Couldn‘t find stream information.(无法获取流信息)\n“);
return -1;
}
videoindex=-1;
for(i=0; inb_streams; i++) 
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
{
videoindex=i;
break;
}
if(videoindex==-1)
{
printf(“Didn‘t find a video stream.(没有找到视频流)\n“);
return -1;
}
pCodecCtx=pFormatCtx->streams[videoindex]->codec;
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL)
{
printf(“Codec not found.(没有找到解码器)\n“);
return -1;
}
if(avcodec_open2(pCodecCtx pCodecNULL)<0)
{
printf(“Could not open codec.(无法打开解码器)\n“);
return -1;
}
AVframe *pframe*pframeYUV;
pframe=avcodec_alloc_frame();
pframeYUV=avcodec_alloc_frame();
uint8_t *out_buffer;
out_buffer=new uint8_t[avpicture_get_size(PIX_FMT_YUV420P pCodecCtx->width pCodecCtx->height)];
avpicture_fill((AVPicture *)pframeYUV out_buffer PIX_FMT_YUV420P pCodecCtx->width pCodecCtx->height);
//------------SDL----------------
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  
printf( “Could not initialize SDL - %s\n“ SDL_GetError()); 
return -1;

SDL_Surface *screen; 
screen = SDL_SetVideoMode(pCodecCtx->width pCodecCtx->height 0 0);
if(!screen) {  
printf(“SDL: could not set video mode - exiting\n“);  
return -1;
}
SDL_Overlay *bmp; 
bmp = SDL_CreateYUVOverlay(pCodecCtx->width pCodecCtx->heightSDL_YV12_OVERLAY screen); 
SDL_Rect rect;
//---------------
int ret got_picture;
int y_size = pCodecCtx->width * pCodecCtx->height;

AVPacket *packet=(AVPacket *)av_malloc(sizeof(AVPacket));
av_new_packet(packet y_size);
//输出一下信息-----------------------------
printf(“File Information(文件信息)---------------------\n“);
av_dump_format(pFormatCtx0filepath0);
printf(“-------------------------------------------------\n“);
struct SwsContext *img_convert_ctx;
img_convert_ctx = sws_getContext(pCodecCtx->width pCodecCtx->height pCodecCtx->pix_fmt pCodecCtx->width pCodecCtx->height PIX_FMT_YUV420P SWS_BICUBIC NULL NULL NULL); 
//------------------------------
while(av_read_frame(pFormatCtx packet)>=

评论

共有 条评论