资源简介

1.使用ffmpeg将多张图片生成H264文件; 2.从H264文件中获取一帧图片和一帧中的SLICE图片; 3.能够直接使用ffplay.exe播放H264文件; 4.完整工程,可直接运行(附带测试图片和实例); 5.vs2013;

资源截图

代码片段和文件信息

#include “Decoder.h“
#include “ShareHeader.h“

CDecoder::CDecoder(const char *_fpath)
: m_filePath(_fpath)
 m_VideoStream(-1)
{

}

CDecoder::~CDecoder()
{
uninit();
}

void CDecoder::init(DECODERFORMAT _fmt)
{
RETURN_H264(_access(m_filePath.c_str() 0) == -1 “file does not existed.\n“);

//get a AVFormatContext.
m_pFmtContext = avformat_alloc_context();
RETURN_H264(m_pFmtContext == 0 “Decoder initialize fail.\n“);

//open video file.
RETURN_H264(avformat_open_input(&m_pFmtContext m_filePath.c_str() NULL NULL) < 0 “open input fail.\n“);

//get streams information.
RETURN_H264(avformat_find_stream_info(m_pFmtContext NULL) < 0 “no stream information.\n“);

//get video stream.
for (unsigned int i = 0; i < m_pFmtContext->nb_streams; ++i)
{
if (m_pFmtContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
{
m_VideoStream = i;
break;
}
}

//get decoder.
AVCodec *pDecoder = avcodec_find_decoder(m_pFmtContext->streams[m_VideoStream]->codecpar->codec_id);
RETURN_H264(pDecoder == 0 “was not find decoder.\n“);
//allloc a AVCodecContext.
m_pCodecContext = avcodec_alloc_context3(pDecoder);
RETURN_H264(m_pCodecContext == 0 “alloc AVCodecContext fail.\n“);
//codec paramter to AVCodecContext.
avcodec_parameters_to_context(m_pCodecContext m_pFmtContext->streams[m_VideoStream]->codecpar);

//open decoder.
RETURN_H264(avcodec_open2(m_pCodecContext pDecoder NULL) < 0 “open decoder fail.\n“);

//alloc frame to deal with data.
m_pframeData = av_frame_alloc();
m_pframeRGBA = av_frame_alloc();

//make sure the size of picture.
switch (_fmt)
{
case FMT_BGR24: m_src_pix_fmt = AV_PIX_FMT_BGR24; break;
case FMT_RGB24: m_src_pix_fmt = AV_PIX_FMT_RGB24; break;
//case FMT_RGBA:  m_src_pix_fmt = AV_PIX_FMT_RGBA;  break;
default:break;
}
int _size = av_image_get_buffer_size(m_src_pix_fmt m_pCodecContext->width m_pCodecContext->height 2);
uint8_t *_buf = (uint8_t *)av_malloc(_size);
av_image_fill_arrays(m_pframeRGBA->data m_pframeRGBA->linesize _buf m_src_pix_fmt m_pCodecContext->width m_pCodecContext->height 2);

//get a swsContext by format.
m_pSwsContext = sws_getContext(
m_pCodecContext->width m_pCodecContext->height m_pCodecContext->pix_fmt
m_pCodecContext->width m_pCodecContext->height m_src_pix_fmt
SWS_BICUBIC NULL NULL NULL);
RETURN_H264(m_pSwsContext == 0 “get a swsContext fail.\n“);
}

void CDecoder::setCallBack(PICTUREDATA _func)
{
m_pFunc = _func;
}

void CDecoder::Procframe()
{
RETURN_H264(m_pFmtContext == 0 || m_pCodecContext == 0 || m_pframeData == 0 || m_pframeRGBA == 0 || m_pSwsContext == 0
“paramters is null.\n“);

AVPacket packet;
while (m_VideoStream != -1 && m_bExit == false)
{
if (m_bPause)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
continue;
}

BREAK_H264(av_read_frame(m_pFmtContext &packet) < 0
“read frame fail or eof.\n“);


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1899  2018-10-09 11:11  H264\FFmpeg2Video.sln

     文件       1207  2018-07-25 16:41  H264\include\libavcodec\ac3_parser.h

     文件       1354  2018-07-25 16:41  H264\include\libavcodec\adts_parser.h

     文件     211684  2018-07-25 16:41  H264\include\libavcodec\avcodec.h

     文件       2570  2018-07-25 16:41  H264\include\libavcodec\avdct.h

     文件       3111  2018-07-25 16:41  H264\include\libavcodec\avfft.h

     文件       2853  2018-07-25 16:41  H264\include\libavcodec\d3d11va.h

     文件       4044  2018-07-25 16:41  H264\include\libavcodec\dirac.h

     文件       3715  2018-07-25 16:41  H264\include\libavcodec\dv_profile.h

     文件       2361  2018-07-25 16:41  H264\include\libavcodec\dxva2.h

     文件       1650  2018-07-25 16:41  H264\include\libavcodec\jni.h

     文件       2825  2018-07-25 16:41  H264\include\libavcodec\mediacodec.h

     文件       3763  2018-07-25 16:41  H264\include\libavcodec\qsv.h

     文件       2297  2018-07-25 16:41  H264\include\libavcodec\vaapi.h

     文件       5796  2018-07-25 16:41  H264\include\libavcodec\vdpau.h

     文件       4785  2018-07-25 16:41  H264\include\libavcodec\version.h

     文件       4029  2018-07-25 16:41  H264\include\libavcodec\videotoolbox.h

     文件       2285  2018-07-25 16:41  H264\include\libavcodec\vorbis_parser.h

     文件       6062  2018-07-25 16:41  H264\include\libavcodec\xvmc.h

     文件      17918  2018-07-25 16:41  H264\include\libavdevice\avdevice.h

     文件       1861  2018-07-25 16:41  H264\include\libavdevice\version.h

     文件      42263  2018-07-25 16:41  H264\include\libavfilter\avfilter.h

     文件       6316  2018-07-25 16:41  H264\include\libavfilter\buffersink.h

     文件       6608  2018-07-25 16:41  H264\include\libavfilter\buffersrc.h

     文件       2334  2018-07-25 16:41  H264\include\libavfilter\version.h

     文件     117558  2018-07-25 16:41  H264\include\libavformat\avformat.h

     文件      31557  2018-07-25 16:41  H264\include\libavformat\avio.h

     文件       3781  2018-07-25 16:41  H264\include\libavformat\version.h

     文件       1673  2018-07-25 16:41  H264\include\libavutil\adler32.h

     文件       1834  2018-07-25 16:41  H264\include\libavutil\aes.h

............此处省略380个文件信息

评论

共有 条评论