首页 > 其他分享 >x264 yuv to h264 c99

x264 yuv to h264 c99

时间:2024-02-21 14:55:27浏览次数:21  
标签:picture h264 c99 nal encoder x264 parameter IMAGE

如何编译引入x264

正式编码

#include <stdint.h>
#include <x264.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>


#define CLEAR(x) (memset((&x),0,sizeof(x)))
#define IMAGE_WIDTH   1920
#define IMAGE_HEIGHT  1080
#define ENCODER_PRESET "veryfast"
#define ENCODER_TUNE   "zerolatency"
#define ENCODER_PROFILE  "baseline"
#define ENCODER_COLORSPACE X264_CSP_I420

typedef struct my_x264_encoder
{
    x264_param_t* x264_parameter;
    char parameter_preset[20];
    char parameter_tune[20];
    char parameter_profile[20];
    x264_t* x264_encoder;
    x264_picture_t* yuv420p_picture;
    long colorspace;
    unsigned char* yuv;
    x264_nal_t* nal;
} my_x264_encoder;

char* read_filename = "/Users/jimogangdan/Downloads/video1.yuv";
char* write_filename = "/Users/jimogangdan/CLionProjects/x264_encoder/video1.h264";

int main(int argc, char** argv)
{
    int fd_read, fd_write;
    my_x264_encoder* encoder = malloc(sizeof(my_x264_encoder));
    if (!encoder)
    {
        printf("cannot malloc my_x264_encoder !\n");
        exit(EXIT_FAILURE);
    }
    CLEAR(*encoder);

    strcpy(encoder->parameter_preset, ENCODER_PRESET);
    strcpy(encoder->parameter_tune, ENCODER_TUNE);

    encoder->x264_parameter = (x264_param_t*)malloc(sizeof(x264_param_t));
    if (!encoder->x264_parameter)
    {
        printf("malloc x264_parameter error!\n");
        exit(EXIT_FAILURE);
    }


    CLEAR(*(encoder->x264_parameter));
    x264_param_default(encoder->x264_parameter);

    encoder->x264_parameter->i_threads = X264_SYNC_LOOKAHEAD_AUTO;

    encoder->x264_parameter->i_width = IMAGE_WIDTH;
    encoder->x264_parameter->i_height = IMAGE_HEIGHT;
    encoder->x264_parameter->i_frame_total = 0;
    encoder->x264_parameter->i_keyint_max = 25;

    encoder->x264_parameter->i_bframe = 5;
    encoder->x264_parameter->b_open_gop = 0;
    encoder->x264_parameter->i_bframe_pyramid = 0;
    encoder->x264_parameter->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;


    encoder->x264_parameter->i_log_level = X264_LOG_DEBUG;

    encoder->x264_parameter->i_fps_den = 1; //码率分母
    encoder->x264_parameter->i_fps_num = 25; //码率分子
    encoder->x264_parameter->b_intra_refresh = 1;
    encoder->x264_parameter->b_annexb = 1;

    strcpy(encoder->parameter_profile, ENCODER_PROFILE);


    encoder->x264_encoder = x264_encoder_open(encoder->x264_parameter);
    encoder->colorspace = ENCODER_COLORSPACE;

    encoder->yuv420p_picture = (x264_picture_t*)malloc(sizeof(x264_picture_t));
    if (!encoder->yuv420p_picture)
    {
        printf("malloc encoder->yuv420p_picture error!\n");
        exit(EXIT_FAILURE);
    }


    encoder->yuv420p_picture->img.i_csp = encoder->colorspace;
    encoder->yuv420p_picture->img.i_plane = 3;
    encoder->yuv420p_picture->i_type = X264_TYPE_AUTO;

    encoder->yuv = (uint8_t*)malloc(IMAGE_WIDTH * IMAGE_HEIGHT * 3 / 2);
    if (!encoder->yuv)
    {
        printf("malloc yuv error!\n");
        exit(EXIT_FAILURE);
    }
    CLEAR(*(encoder->yuv));
    encoder->yuv420p_picture->img.plane[0] = encoder->yuv;
    encoder->yuv420p_picture->img.plane[1] = encoder->yuv + IMAGE_WIDTH * IMAGE_HEIGHT;
    encoder->yuv420p_picture->img.plane[2] = encoder->yuv + IMAGE_WIDTH * IMAGE_HEIGHT + IMAGE_WIDTH * IMAGE_HEIGHT / 4;

    if ((fd_read = open(read_filename,O_RDONLY)) < 0)
    {
        printf("cannot open input file!\n");
        exit(EXIT_FAILURE);
    }

    if ((fd_write = open(write_filename,O_WRONLY | O_APPEND | O_CREAT, 0777)) < 0)
    {
        printf("cannot open output file!\n");
        exit(EXIT_FAILURE);
    }

    int n_nal = 0;
    x264_nal_t* my_nal;
    encoder->nal = (x264_nal_t*)malloc(sizeof(x264_nal_t));
    if (!encoder->nal)
    {
        printf("malloc x264_nal_t error!\n");
        exit(EXIT_FAILURE);
    }
    CLEAR(*(encoder->nal));

    while (read(fd_read, encoder->yuv,IMAGE_WIDTH * IMAGE_HEIGHT * 3 / 2) > 0)
    {
        encoder->yuv420p_picture->i_pts++;
        for (my_nal = encoder->nal; my_nal < encoder->nal + n_nal; ++my_nal)
        {
            write(fd_write, my_nal->p_payload, my_nal->i_payload);
        }
    }

    free(encoder->yuv);
    free(encoder->yuv420p_picture);
    free(encoder->x264_parameter);
    x264_encoder_close(encoder->x264_encoder);
    free(encoder);
    close(fd_read);
    close(fd_write);

    return 0;
}


标签:picture,h264,c99,nal,encoder,x264,parameter,IMAGE
From: https://www.cnblogs.com/guanchaoguo/p/18025198

相关文章

  • x264 静态编译
    编译 ./configure--prefix=$HOME/CLionProjects/x264_encoder/Output/x264--enable-static--disable-shared--enable-libx264--enable-gpl--extra-cflags=-I/Users/jimogangdan/CLionProjects/x264_encoder/Output/x264/include--extra-ldflags=-L/Users/jimogangdan/C......
  • H264码流分析
    1.frame_num的检测frame_num被用作图片的标识符,应由比特流中的log2_max_frame_num_minus4+4位表示。frame_num的约束如下:变量PrevRefFrameNum的导出方式如下:如果当前图片是IDR图片,PrevRefFrameNum被设为0。否则(当前图片不是IDR图片),PrevRefFrameNum被设为:如果在8.2......
  • C99标准前后对于二维数组的动态声明问题
    html:toc:true写在前面:出于作者不了解C99以前标准中对二维数组的动态声明而导致的一场考场事故,作者写下这篇文章,,以便其他同学在遇到类似问题时不要犯同样的错误,同时作为对自己的警醒.本文主要是关于对于二维数组动态声明问题在不同C标准下方法的探讨,将给出一个简......
  • WebSocket-FLV H264/H265服务器基本实现
    场景HTTP-FLV:基于HTTP流式IO传输FLV,依赖浏览器支持播放FLV。但是由于同源的限制问题,浏览器只能播放六路视频,因此采用WebSocket-FLVWebSocket-FLV:基于WebSocket传输FLV,依赖浏览器支持播放FLV。WebSocket建立在HTTP之上,建立WebSocket连接前还要先建立HTTP连接。视频参数代码H264S......
  • 格式工厂MP4视频转格式(H265->H264)图文详解
    最近上传到网站上的视频播放时只有声音没有图像,但是在本地播放一切正常,检查后发现问题是有些浏览器不支持播放H265格式的视频。不能让访问网站的用户去换浏览器或者单独安装浏览器插件,最简单的解决办法还是自己转化视频格式重新上传。推荐一个老牌免费使用简单的视频格式转换软件—......
  • Could not find codec parameters for stream 0 (Video: h264, none)
    Couldnotfindcodecparametersforstream0(Video:h264,none)在使用视频处理工具或者播放器时,有时我们可能会遇到错误信息"Couldnotfindcodecparametersforstream0(Video:h264,none)"。这个错误提示说明在当前的环境中找不到视频流的编解码器参数,导致无法正确解......
  • web前端(Vue2.x)接收H264实时视频码流(二进制)进行播放
    1、安装 [email protected]、.vue文件中使用<template><div><videoid="dom_id"muted="muted"controlsclass="video_box"></video><divv-if="!has_data"v-loading="!......
  • 【畅联】H264视频流格式解析
      ......
  • C99中的柔性数组和其内在本质
    示例:#include<stdio.h>#include<stdlib.h>//定义一个包含柔性数组的结构体structflex_array{ intsize; intdata[0];};intmain(){ inti; intsize=10; //动态分配内存 structflex_array*arr=malloc(sizeof(structflex_array)+sizeof(int)*si......
  • 前端判断视频格式(H264、H265,解决谷歌chrome浏览器无法播放mp4问题)
    chrome浏览器对某些mp4文件不支持,播放时只有声音没有画面。这种情况一般是因为视频文件为H265编码,而chrome浏览器只支持H264编码的文件(谷歌没买H265的使用专利)。 解决方法一:使用软件(格式工厂或命令行库ffmpeg)对文件进行转换,将H265转换成H264。格式工厂: ffmpeg:ffmpeg-i......