ubuntu c语言 opencv实现h265 编码

在Ubuntu上使用C语言和OpenCV实现H.265编码,你可以遵循以下步骤:
安装依赖:
首先确保你的系统已经安装了Ubuntu最新版本,并更新所有包列表。
安装FFmpeg,因为OpenCV使用FFmpeg来处理视频编码。可以使用以下命令安装:

复制
sudo apt update
sudo apt install ffmpeg

安装OpenCV:
OpenCV库本身不直接支持H.265编码,但是它可以通过FFmpeg进行编码。你可以从OpenCV官方网站获取源码并编译安装,或者使用包管理器安装。
使用包管理器安装OpenCV:

1
2
3
复制
sudo apt update
sudo apt install libopencv-dev

编写C语言代码:
利用OpenCV的视频处理功能,读取视频帧,然后使用FFmpeg的API进行H.265编码
下面是一个简单的示例代码框架,展示如何使用OpenCV和FFmpeg进行视频编码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <opencv2/opencv.hpp>
#include <ffmpeg/libavcodec/avcodec.h>
#include <ffmpeg/libavformat/avformat.h>
#include <ffmpeg/libavutil/imgutils.h>
 
int main() {
    // 初始化FFmpeg的编码器
    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_HEVC);
    if (!codec) {
        fprintf(stderr, " Codec not found \n");
        return -1;
    }
     
    // 打开编码器
    AVCodecContext *codecCtx = avcodec_alloc_context3(codec);
    if (!codecCtx) {
        fprintf(stderr, "could not alloc avcodec context\n");
        return -1;
    }
     
    // 设置编码器参数
    avcodec_get_context_defaults3(codecCtx, codec);
     
    // 打开视频流
    AVFormatContext *formatCtx = NULL;
    if (avformat_alloc_output_context2(&formatCtx, NULL, "mpeg", "output_video") < 0) {
        fprintf(stderr, "Could not create output format context\n");
        return -1;
    }
     
    // 添加流
    AVStream *videoStream = avformat_new_stream(formatCtx, codec);
    if (!videoStream) {
        fprintf(stderr, "Could not create video stream\n");
        return -1;
    }
     
    // 将编码器参数应用到流
    avcodec_parameters_from_context(videoStream->codecpar, codecCtx);
     
    // 打开编码器
    if (avcodec_open2(codecCtx, codec, NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        return -1;
    }
     
    // 准备编码
    AVPacket *packet = av_packet_alloc();
    AVFrame *frame = av_frame_alloc();
    int frame_width = 640;
    int frame_height = 480;
    int ret;
     
    // 设置帧参数
    frame->format = codecCtx->pix_fmt;
    frame->width = frame_width;
    frame->height = frame_height;
    frame->pts = 0;
     
    //  alloc the frame data
    ret = av_frame_get_buffer(frame, 32);
    if (ret < 0) {
        fprintf(stderr, "Could not allocate the frame data\n");
        return -1;
    }
     
    // 创建一个用来写入视频的文件流
    AVOutputFormat *outputFormat = NULL;
    outputFormat = av_guess_format("mpeg", NULL, NULL);
    if (!outputFormat) {
        fprintf(stderr, "Could not guess output format

  

 

posted @   瘋耔  阅读(342)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2021-03-09 视觉SLAM和激光SLAM的实现
2020-03-09 busybox添加wireless tool工具iwlist iwconfig (TODO)
2019-03-09 matlab的三维绘图和四维绘图
2018-03-09 系统调用彻底理解
2018-03-09 Linux文件系统学习(一)之相关概念⭐⭐⭐
2018-03-09 platform_device和platform_driver的注册过程,及probe函数何时调用的分析 ⭐⭐⭐
2018-03-09 linux下.so、.ko、.a的区别
跳至侧栏
点击右上角即可分享
微信分享提示