资源简介
本程序实现了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个文件信息
相关资源
- 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
- 安卓交叉编译ffmepgx86_64版本
评论
共有 条评论