资源简介
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)>=
相关资源
- 最简单的基于FFMPEG的音频编码器 1.1
- ffmpeg提取mp4关键帧保存为jpg.zip
- ffmpeg+qt的简单播放器
- 使用ffmpeg将多张图片生成H264裸流并获
- ffmpeg h264 转换jpg
- 利用FFmpeg将Jpeg图片转为任意视频容器
- ffmpeg exeWINXP的最后一个可运行版本
- 最简单的基于FFMPEG的视频编码器修正
- ffmpeg-vs2013
- 基于FFMPEG_SDL2_音视频播放_参考音频时
- ffmpeg-3.2-win32-shared.zip
- ffmpeg录音
- ffmpeg资料全
- ffmpeg_windows屏幕录制并编码成H264
- windows32位系统的ffmpeg
- 利用ffmpeg提取任意格式视频帧关键帧
- ffmpeg3.0源码
- FFmpeg解码+SDL播放
- ffmpeg封装H264成MP4、AVI视频格式,及提
- 从零开始学习音视频编程技术十二 录
- AudioResample
- 最简单的基于FFmpeg的libswscale的教程
- ffmpeg-2.5.2-win32-shared
- 利用FFmpeg将mkv视频转换为H.264
- 安卓交叉编译ffmepgx86_64版本
- ffmepg的安卓arm(armeabi-v7a)版本
- 基于ARM9的远程视频监控系统
- 基于QT的音乐播放器源代码及详细教程
- 最简单的基于FFmpeg的封装格式转换器
- SDK播放器加速.zip
评论
共有 条评论