• 大小: 30.96MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-30
  • 语言: 其他
  • 标签: FFmpeg  YUV  H.264  编码  

资源简介

本程序实现了YUV像素数据编码为视频码流(H.265,H264,MPEG2,VP8等等)。是最简单的FFmpeg视频编码方面的教程。它包含以下两个子项目: simplest_ffmpeg_video_encoder:最简单的基于FFmpeg的视频编码器。使用libavcodec和libavformat编码并且封装视频。 simplest_ffmpeg_video_encoder_pure:最简单的基于FFmpeg的视频编码器-纯净版。仅使用libavcodec编码视频,不使用libavformat。 1.2版本增加了多平台下编译的支持:Windows,MacOS,以及Linux。

资源截图

代码片段和文件信息

/**
 * 最简单的基于FFmpeg的视频编码器
 * Simplest FFmpeg Video Encoder
 * 
 * 雷霄骅 Lei Xiaohua
 * leixiaohua1020@126.com
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 * 
 * 本程序实现了YUV像素数据编码为视频码流(H264,MPEG2,VP8等等)。
 * 是最简单的FFmpeg视频编码方面的教程。
 * 通过学习本例子可以了解FFmpeg的编码流程。
 * This software encode YUV420P data to H.264 bitstream.
 * It‘s the simplest video encoding software based on FFmpeg. 
 * Suitable for beginner of FFmpeg 
 */

#include 

#define __STDC_CONSTANT_MACROS

#ifdef _WIN32
//Windows
extern “C“
{
#include “libavutil/opt.h“
#include “libavcodec/avcodec.h“
#include “libavformat/avformat.h“
};
#else
//Linux...
#ifdef __cplusplus
extern “C“
{
#endif
#include 
#include 
#include 
#ifdef __cplusplus
};
#endif
#endif


int flush_encoder(AVFormatContext *fmt_ctxunsigned int stream_index){
int ret;
int got_frame;
AVPacket enc_pkt;
if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities &
CODEC_CAP_DELAY))
return 0;
while (1) {
enc_pkt.data = NULL;
enc_pkt.size = 0;
av_init_packet(&enc_pkt);
ret = avcodec_encode_video2 (fmt_ctx->streams[stream_index]->codec &enc_pkt
NULL &got_frame);
av_frame_free(NULL);
if (ret < 0)
break;
if (!got_frame){
ret=0;
break;
}
printf(“Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n“enc_pkt.size);
/* mux encoded frame */
ret = av_write_frame(fmt_ctx &enc_pkt);
if (ret < 0)
break;
}
return ret;
}

int main(int argc char* argv[])
{
AVFormatContext* pFormatCtx;
AVOutputFormat* fmt;
AVStream* video_st;
AVCodecContext* pCodecCtx;
AVCodec* pCodec;
AVPacket pkt;
uint8_t* picture_buf;
AVframe* pframe;
int picture_size;
int y_size;
int framecnt=0;
//FILE *in_file = fopen(“src01_480x272.yuv“ “rb“); //Input raw YUV data 
FILE *in_file = fopen(“../ds_480x272.yuv“ “rb“);   //Input raw YUV data
int in_w=480in_h=272;                              //Input data‘s width and height
int framenum=100;                                   //frames to encode
//const char* out_file = “src01.h264“;              //Output Filepath 
//const char* out_file = “src01.ts“;
//const char* out_file = “src01.hevc“;
const char* out_file = “ds.h264“;

av_register_all();
//Method1.
pFormatCtx = avformat_alloc_context();
//Guess Format
fmt = av_guess_format(NULL out_file NULL);
pFormatCtx->oformat = fmt;

//Method 2.
//avformat_alloc_output_context2(&pFormatCtx NULL NULL out_file);
//fmt = pFormatCtx->oformat;


//Open output URL
if (avio_open(&pFormatCtx->pbout_file AVIO_FLAG_READ_WRITE) < 0){
printf(“Failed to open output file! \n“);
return -1;
}

video_st = avformat_new_stream(pFormatCtx 0);
video_st->time_base.num = 1; 
video_st->time_base.den = 25;  

if (video_st==NULL){
return -1;
}
//Par

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件          28  2015-02-12 17:38  .gitignore
     文件    19584000  2015-02-12 17:38  ds_480x272.yuv
     文件        1053  2015-02-12 17:38  readme.txt
     文件       67142  2015-02-12 17:38  simplest_ffmpeg_video_encoder.jpg
     文件        1469  2015-02-12 17:38  simplest_ffmpeg_video_encoder.sln
     文件       22528  2015-02-12 17:38  simplest_ffmpeg_video_encoder.suo
     目录           0  2015-02-12 17:38  simplest_ffmpeg_video_encoder\
     文件          61  2015-02-12 17:38  simplest_ffmpeg_video_encoder\.gitignore
     文件    19294208  2015-02-12 17:38  simplest_ffmpeg_video_encoder\avcodec-56.dll
     文件     1341440  2015-02-12 17:38  simplest_ffmpeg_video_encoder\avdevice-56.dll
     文件     2201088  2015-02-12 17:38  simplest_ffmpeg_video_encoder\avfilter-5.dll
     文件     5721088  2015-02-12 17:38  simplest_ffmpeg_video_encoder\avformat-56.dll
     文件      424960  2015-02-12 17:38  simplest_ffmpeg_video_encoder\avutil-54.dll
     文件         632  2015-02-12 17:38  simplest_ffmpeg_video_encoder\compile_cl.bat
     文件         439  2015-02-12 17:38  simplest_ffmpeg_video_encoder\compile_gcc.sh
     文件         462  2015-02-12 17:38  simplest_ffmpeg_video_encoder\compile_mingw.sh
     文件      201505  2015-02-12 17:38  simplest_ffmpeg_video_encoder\ds.h264
     目录           0  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\
     文件        7976  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\_mingw.h
     文件        5721  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\inttypes.h
     目录           0  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\
     文件      177529  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\avcodec.h
     文件        3111  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\avfft.h
     文件        3659  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\dv_profile.h
     文件        2358  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\dxva2.h
     文件       10623  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\old_codec_ids.h
     文件        4007  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\vaapi.h
     文件        5437  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\vda.h
     文件        6200  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\vdpau.h
     文件        6035  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\version.h
     文件        6062  2015-02-12 17:38  simplest_ffmpeg_video_encoder\include\libavcodec\xvmc.h
............此处省略202个文件信息

评论

共有 条评论