资源简介
利用ffmpeg库进行视频的解码,将解码获取到的帧进行本地存储为ppm格式的图片文件。ppm格式的图片文件大部分的图片软件都能进行解析。
代码片段和文件信息
#include
extern “C“{
#include “libavcodec/avcodec.h“
#include “libavformat/avformat.h“
#include “libswscale/swscale.h“
}
void saveframe(AVframe* pframe int width int height int iframe)
{
FILE *pFile;
char szFilename[32];
int y;
sprintf(szFilename “frame%d.ppm“ iframe);
pFile = fopen(szFilename “wb“);
if (pFile == NULL)
return;
fprintf(pFile “P6\n%d %d\n255\n“ width height);
for (y = 0; y < height; y++)
fwrite(pframe->data[0] + y*pframe->linesize[0] 1 width * 3 pFile);
fclose(pFile);
}
int main()
{
AVFormatContext *pFormatCtx;
int i videoIndex;
AVCodecContext *pCodecCtx = NULL;
AVCodec *pCodec = NULL;
AVPacket packet;
int frameFinished;
int numBytes;
uint8_t *buffer;
//char* filename = “nihao.avi“;
char* filename = “cuc_ieschool.flv“;
pFormatCtx = avformat_alloc_context();
av_register_all();
if (avformat_open_input(&pFormatCtx filename NULL 0) != 0)
return -1;
if (avformat_find_stream_info(pFormatCtx NULL) < 0)
return -1;
av_dump_format(pFormatCtx 0 filename 0);
videoIndex = -1;
for (i = 0; i < pFormatCtx->nb_streams; ++i){
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){
videoIndex = i;
break;
}
}
if (videoIndex == -1)
{
fprintf(stderr “unsupport codec\n“);
return -1;
}
pCodecCtx = pFormatCtx->streams[videoIndex]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (avcodec_open2(pCodecCtx pCodec NULL) < 0)
return -1;
AVframe *pframeRGB *pframe;
pframe = av_frame_alloc();
pframeRGB = av_frame_alloc();
if (pframe == NULL)
return -1;
numBytes = avpicture_get_size(PIX_FMT_RGB24 pCodecCtx->width pCodecCtx->height);
buffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));
avpicture_fill((AVPicture*)pframeRGB buffer PIX_FMT_RGB24 pCodecCtx->width pCodecCtx->height);
i = 0;
struct SwsContext* img_convert_ctx;
img_convert_ctx = sws_getContext(pCodecCtx->width pCodecCtx->height pCodecCtx->pix_fmt
pCodecCtx->width pCodecCtx->height PIX_FMT_RGB24 SWS_BICUBIC NULL NULL NULL);
while (av_read_frame(pFormatCtx &packet) >= 0){
if (packet.stream_index == videoIndex){
avcodec_decode_video2(pCodecCtx pframe &frameFinished &packet);
if (frameFinished)
{
sws_scale(img_convert_ctx pframe->data pframe->linesize 0 pCodecCtx->height
pframeRGB->data pframeRGB->linesize);
if (++i <= 100)
saveframe(pframeRGB pCodecCtx->width pCodecCtx->height i);
}
}
av_free_packet(&packet);
}
av_free(buffer);
av_free(pframeRGB);
av_free(pframe);
avcodec_close(pCodecCtx);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 933615 2014-01-01 18:46 ffmpeg_get_ppm\cuc_ieschool.flv
文件 4474 2014-11-11 16:32 ffmpeg_get_ppm\ffmpeg01.vcxproj
文件 945 2014-11-11 15:41 ffmpeg_get_ppm\ffmpeg01.vcxproj.filters
文件 1051 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\aix\math.h
文件 33225 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\avisynth\avisynth_c.h
文件 2679 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\avisynth\avisynth_c_25.h
文件 26159 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\avisynth\avxsynth_c.h
文件 1743 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\avisynth\windowsPorts\basicDataTypeConversions.h
文件 2322 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\avisynth\windowsPorts\windows2linux.h
文件 1140 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\float\float.h
文件 872 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\float\limits.h
文件 2477 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\getopt.c
文件 2126 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\msvcrt\snprintf.c
文件 0 2014-11-04 10:02 ffmpeg_get_ppm\include\compat\msvcrt\snprintf.d
文件 1298 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\msvcrt\snprintf.h
文件 6894 2014-11-04 10:02 ffmpeg_get_ppm\include\compat\msvcrt\snprintf.o
文件 3708 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\os2threads.h
文件 118 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\plan9\head
文件 1154 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\plan9\main.c
文件 86 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\plan9\printf
文件 2126 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\snprintf.c
文件 1298 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\snprintf.h
文件 2778 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\strtod.c
文件 0 2014-11-04 10:02 ffmpeg_get_ppm\include\compat\strtod.d
文件 9200 2014-11-04 10:02 ffmpeg_get_ppm\include\compat\strtod.o
文件 1071 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\tms470\math.h
文件 1064 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\va_copy.h
文件 8566 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\w32pthreads.h
文件 3279 2014-08-17 21:33 ffmpeg_get_ppm\include\compat\windows\makedef
文件 176375 2014-11-04 10:14 ffmpeg_get_ppm\include\libavcodec\avcodec.h
............此处省略169个文件信息
- 上一篇:课程设计-机票预定系统
- 下一篇:有限元方法的数学基础.pdf
相关资源
- 最简单的基于FFmpeg的编码器 1.2
- vs2012调试ffmpeg.c
- 基于FFMPEG SDK流媒体开发1---解码媒体文
- ffmpeg 源码demo
- 最简单的基于FFMPEG的AVDevice的 1.2
- 最简单的基于FFMPEG的音频编码器 1.1
- 最简单的基于FFMPEG+SDL的视频播放器
- 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
评论
共有 条评论