c++ ffmpeg h265
时间: 2024-04-18 13:22:10 浏览: 107
C++中使用FFmpeg进行H265编码的流程如下[^2]:
1. 导入FFmpeg库:
```cpp
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}
```
2. 初始化编码器和编码器上下文:
```cpp
AVCodec *pCodec = NULL;
AVCodecContext *pCodecCtx = NULL;
// 初始化编码器
pCodec = avcodec_find_encoder_by_name("libx265");
if (!pCodec) {
// 处理编码器未找到的情况
return;
}
// 创建编码器上下文
pCodecCtx = avcodec_alloc_context3(pCodec);
if (!pCodecCtx) {
// 处理编码器上下文创建失败的情况
return;
}
// 设置编码器参数
pCodecCtx->width = width; // 视频宽度
pCodecCtx->height = height; // 视频高度
pCodecCtx->bit_rate = bitRate; // 码率
pCodecCtx->time_base = (AVRational){1, frameRate}; // 帧率
pCodecCtx->framerate = (AVRational){frameRate, 1}; // 帧率
pCodecCtx->gop_size = gopSize; // GOP大小
pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P; // 像素格式
// 打开编码器
if (avcodec_open2(pCodecCtx, pCodec, &dictParam) < 0) {
// 处理编码器打开失败的情况
return;
}
```
3. 创建帧和数据包:
```cpp
AVFrame *pFrame = NULL;
AVPacket *pPkt = NULL;
// 创建帧
pFrame = av_frame_alloc();
if (!pFrame) {
// 处理帧创建失败的情况
return;
}
// 创建数据包
pPkt = av_packet_alloc();
if (!pPkt) {
// 处理数据包创建失败的情况
return;
}
```
4. 编码和写入文件:
```cpp
// 将原始图像数据填充到帧中
av_image_fill_arrays(pFrame->data, pFrame->linesize, rawData, AV_PIX_FMT_YUV420P, width, height, 1);
// 发送帧给编码器
if (avcodec_send_frame(pCodecCtx, pFrame) < 0) {
// 处理发送帧失败的情况
return;
}
// 接收编码后的数据包
while (avcodec_receive_packet(pCodecCtx, pPkt) == 0) {
// 写入文件
fwrite(pPkt->data, 1, pPkt->size, outputFile);
av_packet_unref(pPkt);
}
// 刷新编码器
avcodec_send_frame(pCodecCtx, NULL);
while (avcodec_receive_packet(pCodecCtx, pPkt) == 0) {
// 写入文件
fwrite(pPkt->data, 1, pPkt->size, outputFile);
av_packet_unref(pPkt);
}
```
请注意,上述代码仅为示例,实际使用时需要根据具体情况进行适当修改。
阅读全文