Files
crossdesk/src/media/video/encode/ffmpeg/ffmpeg_encoder.h
2023-09-20 16:54:56 +08:00

63 lines
1.3 KiB
C++

#ifndef _FFMPEG_ENCODER_H_
#define _FFMPEG_ENCODER_H_
#ifdef _WIN32
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
}
#else
#ifdef __cplusplus
extern "C" {
#endif
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libavutil/opt.h>
}
#ifdef __cplusplus
};
#endif
#endif
#include <functional>
class VideoEncoder {
public:
VideoEncoder();
~VideoEncoder();
int Init();
int Encode(
const uint8_t* pData, int nSize,
std::function<int(char* encoded_packets, size_t size)> on_encoded_image);
virtual int OnEncodedImage(char* encoded_packets, size_t size);
void ForceIdr();
private:
int frame_width_ = 1280;
int frame_height = 720;
int keyFrameInterval_ = 3000;
int maxBitrate_ = 1000;
int fps_ = 30;
int max_payload_size_ = 3000;
std::vector<std::vector<uint8_t>> encoded_packets_;
unsigned char* encoded_image_ = nullptr;
FILE* file_ = nullptr;
unsigned char* nv12_data_ = nullptr;
unsigned int seq_ = 0;
const AVCodec* codec_ = nullptr;
AVCodecContext* codec_ctx_ = nullptr;
AVFrame* frame_ = nullptr;
AVPacket* packet_;
bool got_output_ = false;
uint32_t pts_ = 0;
};
#endif