需要实现的功能: 把h264文件进行解码,解码后然后进行mpeg1的编码. 这一步完成接下来再实现存储为ts,本篇代码实现了第一部分,
注意事项:
ffmpeg版本问题,今天2020.2.11的最新版本是ffmpeg 4.2.2,这个对mpeg1video的编码支持不行.
使用ffmpeg sample encode_video.c会报:
mpeg1video The encoder timebase is not set的错误.
其实这个导致的主要问题是版本问题,推荐大家使用:ffmpeg 3.2.14版本.
具体代码:
#ifdef __cplusplus
extern "C" {
#endif
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/time.h>
#include <libavutil/avutil.h>
#include <libavutil/imgutils.h>
#include <libavutil/hwcontext.h>
#include <libavutil/error.h>
#include <libavfilter/avfilter.h>
#ifdef __cplusplus
}
#endif
/**
* 功能: 实现把h264转码为mpeg1的格式s
* 参考: https://www.jianshu.com/p/8cd90dba49e1
*/
int main()
{
av_register_all();
avcodec_register_all();
avfilter_register_all();
avformat_network_init();
const char *fname = "/mnt/d/x264_encode.264";
// 从h264文件中提取出一帧一帧的数据
AVFormatContext *inputCtx = NULL;
// open the input file
if (avformat_open_input(&inputCtx,fname,NULL,NULL) != 0)
{
fprintf(stderr, "avformat open input file :%s fail.\n" , fname);
return -1;
}
AVPacket packet;
int ret = 0;
// int framesize = 0;
// h624解码为yuv
AVCodec *codec_h264 = avcodec_find_decoder(AV_CODEC_ID_H264);
AVCodecContext *ctx_h264 = avcodec_alloc_context3(codec_h264);
if (avcodec_open2(ctx_h264,codec_h264,NULL) < 0)
{
/* code */
fprintf(stderr, "avcodec_open2 h264 fail.\n" );
exit(1<