• 大小: 11.4MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-31
  • 语言: 其他
  • 标签: 视频  h264  ffmpeg  sdl  

资源简介

根据雷霄骅的代码修改的,使用ffmpeg纯净解码,sdl显示h264,稍作修改就能实时播放h264网络视频流,有较详细的注释,希望对你有所帮助!

资源截图

代码片段和文件信息

/**
 * 最简单的基于FFmpeg的视频解码器(纯净版)
 * Simplest FFmpeg Decoder Pure
 *
 * 雷霄骅 Lei Xiaohua
 * leixiaohua1020@126.com
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 *
 * 本程序实现了视频码流(支持HEVC,H.264,MPEG2等)解码为YUV数据。
 * 它仅仅使用了libavcodec(而没有使用libavformat)。
 * 是最简单的FFmpeg视频解码方面的教程。
 * 通过学习本例子可以了解FFmpeg的解码流程。
 * This software is a simplest decoder based on FFmpeg.
 * It decode bitstreams to YUV pixel data.
 * It just use libavcodec (do not contains libavformat).
 * Suitable for beginner of FFmpeg.
 */

#include 

#define __STDC_CONSTANT_MACROS
#define SDL_MAIN_HANDLED
#ifdef _WIN32
//Windows
extern “C“
{
#include “libavcodec/avcodec.h“
#include “libswscale/swscale.h“
#include “SDL2/SDL.h“
};
#else
//Linux...
#ifdef __cplusplus
extern “C“
{
#endif
#include 
#include 
#ifdef __cplusplus
};
#endif
#endif

#define USE_SWSCALE 1

//test different codec
#define TEST_H264  1
#define TEST_HEVC  0

//SDL Event
#define REFRESH_EVENT  (SDL_USEREVENT + 1)
#define BREAK_EVENT  (SDL_USEREVENT + 2)
#define WINDOW_NAME “Cameree ACS Video“


const int bpp = 12;

int screen_w = 960 screen_h = 540;
const int pixel_w = 1280 pixel_h = 720;
char filepath_in[] = “video.h264“;
// 一帧图像数据长度 width*height*3/2
int buffer_size = pixel_w*pixel_h*bpp / 8;

unsigned char buffer[pixel_w*pixel_h*bpp / 8];


int thread_exit = 0;
bool b_close_window = 0;
int refresh_video(void *opaque) {
thread_exit = 0;
while (!thread_exit) {
SDL_Event event;
event.type = REFRESH_EVENT;
SDL_PushEvent(&event); //添加新的event到event queue
SDL_Delay(33); // ms,可以自己设帧率
}
thread_exit = 0;
//Break
SDL_Event event;
event.type = BREAK_EVENT;
SDL_PushEvent(&event);

return 0;
}

int main(int argc char* argv[])
{
AVCodec *pCodec;
    AVCodecContext *pCodecCtx= NULL;
AVCodecParserContext *pCodecParserCtx=NULL;

    FILE *fp_in;
    AVframe *pframe; //存储一帧解码后的像素数据

const int in_buffer_size=4096;
uint8_t in_buffer[in_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE]={0};
uint8_t *cur_ptr;
int cur_size;
    AVPacket packet; // 存储一帧(一般情况下)压缩编码数据
int ret got_picture;
int y_size;


#if TEST_HEVC
enum AVCodecID codec_id=AV_CODEC_ID_HEVC;
char filepath_in[]=“bigbuckbunny_480x272.hevc“;
#elif TEST_H264
AVCodecID codec_id=AV_CODEC_ID_H264;
#else
AVCodecID codec_id=AV_CODEC_ID_MPEG2VIDEO;
char filepath_in[]=“bigbuckbunny_480x272.m2v“;
#endif

int first_time=1;

#if USE_SWSCALE
struct SwsContext *img_convert_ctx;
AVframe *pframeYUV;
uint8_t *out_buffer;

#endif
//av_log_set_level(AV_LOG_DEBUG);

avcodec_register_all(); //注册所有的编解码器

    pCodec = avcodec_find_decoder(codec_id); //查找解码器
    if (!pCodec) {
        printf(“Codec not found\n“);
        return -1;
    }
    pCodecCtx = avcodec_alloc_context3(pCodec); //为 AVCodecContext 分配内存
    if (!pCodec

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件          75  2015-07-15 16:19  .gitignore
     文件    18936320  2015-07-15 16:19  avcodec-55.dll
     文件      418304  2015-07-15 16:19  avutil-52.dll
     文件      626669  2015-07-15 16:19  bigbuckbunny_480x272.h264
     文件      749932  2015-07-15 16:19  bigbuckbunny_480x272.hevc
     文件      918534  2015-07-15 16:19  bigbuckbunny_480x272.m2v
     文件      391680  2017-06-15 10:05  bigbuckbunny_480x272.yuv
     文件         573  2015-07-15 16:19  compile_cl.bat
     文件         458  2015-07-15 16:19  compile_gcc.sh
     文件         463  2015-07-15 16:19  compile_mingw.sh
     目录           0  2017-06-15 09:46  include\
     文件        6002  2015-07-15 16:19  include\inttypes.h
     目录           0  2015-07-15 16:19  include\libavcodec\
     文件      180728  2015-07-15 16:19  include\libavcodec\avcodec.h
     文件        3229  2015-07-15 16:19  include\libavcodec\avfft.h
     文件        2488  2015-07-15 16:19  include\libavcodec\dxva2.h
     文件       11053  2015-07-15 16:19  include\libavcodec\old_codec_ids.h
     文件        4180  2015-07-15 16:19  include\libavcodec\vaapi.h
     文件        4262  2015-07-15 16:19  include\libavcodec\vda.h
     文件        6415  2015-07-15 16:19  include\libavcodec\vdpau.h
     文件        5759  2015-07-15 16:19  include\libavcodec\version.h
     文件        6232  2015-07-15 16:19  include\libavcodec\xvmc.h
     目录           0  2015-07-15 16:19  include\libavutil\
     文件        1639  2015-07-15 16:19  include\libavutil\adler32.h
     文件        1899  2015-07-15 16:19  include\libavutil\aes.h
     文件        4390  2015-07-15 16:19  include\libavutil\attributes.h
     文件          88  2015-07-15 16:19  include\libavutil\audioconvert.h
     文件        4563  2015-07-15 16:19  include\libavutil\audio_fifo.h
     文件        2179  2015-07-15 16:19  include\libavutil\avassert.h
     文件         218  2015-07-15 16:19  include\libavutil\avconfig.h
     文件       12829  2015-07-15 16:19  include\libavutil\avstring.h
............此处省略133个文件信息

评论

共有 条评论