多媒体 -- 软编码x264使用笔记

背景介绍

x264是一个开源编码库,用于将视频流编码为H.264/MPEG-4 AVC视频格式。该库广泛用于从高清视频转码到低带宽的视频流。

代码下载

git clone http://git.videolan.org/git/x264.git

编译配置

./configure --host=aarch64-poky-linux --cross-prefix=aarch64-poky-linux- --prefix=/home/yocto/host/git/ffmpeg/x264/cminstall --enable-shared
make
make install

参数解析

–host=aarch64-poky-linux: 指定目标主机的类型,这里是基于aarch64的Linux。
–cross-prefix=aarch64-poky-linux-: 设置交叉编译工具的前缀。
–prefix: 指定安装目录。
–enable-shared: 允许构建共享库。

demo代码

#include <stdint.h>
#include <stdio.h>
#include <x264.h>
#include <string.h>
#include "sm_video_capture.h"

int main() {
    int width = 640;
    int height = 480;
    int size = 0;
    FILE *pipeout = fopen("/home/root/x.264", "w");
    int capid = 0;


    // 配置x264参数
    x264_param_t param;
    x264_param_default_preset(&param, "veryfast", "zerolatency");
    param.i_threads = 4;
    param.i_width = width;
    param.i_height = height;
    param.i_fps_num = 30; // 设计帧率:i_fps_num/i_fps_den
    param.i_fps_den = 1;  // 设计帧率:i_fps_num/i_fps_den
    param.i_keyint_max = 10; //最大I帧间隔
    param.i_csp = X264_CSP_I400; // 使用单色色度空间
    param.b_vfr_input = 0;
    param.rc.i_rc_method = X264_RC_CRF;
    param.rc.f_rf_constant = 23; // CRF值,范围从0(无损)到51(最差质量),常用值在18到28之间
    param.b_repeat_headers = 1;  // 重复SPS/PPS 放入关键帧前
    param.b_annexb = 1;

    x264_t *encoder = x264_encoder_open(&param);

    // 准备输入图像
    x264_picture_t pic_in, pic_out;
    x264_picture_alloc(&pic_in, X264_CSP_I400, width, height);
    pic_in.img.i_plane = 1;

    // 假设我们已经有了一幅灰度图像数据,可以从文件中读取
    // 此处需要实际的图像数据处理逻辑
    FILE *file = fopen("a.yuv", "rb");
    fread(pic_in.img.plane[0], 1, width * height, file);
    fclose(file);

    // 编码图像
    x264_nal_t *nals;
    int i_nals;
    int frame_size;
    while (1) {
        frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
        if (frame_size < 0) {
            // 处理失败的情况
            printf("x264_encoder_encode failed! frame_size:%d\n", frame_size);
            break;
        } else if (frame_size == 0) {
            // 没有数据可写入
            continue;
        }
        for (int i = 0; i < i_nals; i++) {
            fwrite(nals[i].p_payload, 1, nals[i].i_payload, pipeout);
        }
    }

    // 清理资源
    x264_picture_clean(&pic_in);
    x264_encoder_close(encoder);
    fclose(pipeout);

    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值