mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
63 lines
1.3 KiB
C++
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 |