Ubuntu下使用ffmpeg调用设备摄像头采集视频,使用libx264编码视频,保存h264文件

Ubuntu下使用ffmpeg调用设备摄像头采集视频,使用libx264编码视频,保存h264文件

主要流程代码:

#define V_WIDTH 640
#define V_HEIGHT 480
void MainWindow::rec_video()
{
   
    AVFormatContext *fmt_ctx = NULL;
    AVPacket packet;

    AVCodecContext *enc_ctx = NULL;

    AVFrame *frame = NULL;
    AVPacket *newpkt = NULL;

    av_init_packet(&packet);
    int ret = 0;
    int base = 0; // 用于给frame->pts赋值,pts需要是连续的值
    // 设置日志级别
    av_log_set_level(AV_LOG_DEBUG);
    // 注册设备
    avdevice_register_all();

    // 创建文件
    char *outPath = "/opt/document/video.yuv";   // 保存视频文件
    FILE *outFile = fopen(outPath, "wb+");
    char *encodePath = "/opt/document/encode.h264";   // 保存视频文件
    FILE *encodefile = fopen(encodePath, "wb+");

    if (!outFile)
    {
   
        goto __ERROR;
    }

    // 打开设备
    fmt_ctx = open_dev();

    // 打开视频编码器
    open_encoder(V_WIDTH, V_HEIGHT, &enc_ctx);

    // 创建AVFrame
    frame = create_frame(V_WIDTH, V_HEIGHT);

    // 创建编码后输出的packet
    newpkt = av_packet_alloc();
    if (!newpkt)
    {
   
        printf("failed to alloc avpacket!/n");
        goto __ERROR;
    }

    if (!fmt_ctx)
    {
   
        goto __ERROR;
    }

    while ((ret = av_read_frame(fmt_ctx, &packet) == 0) && m_status)
    {
   
        av_log(NULL, AV_LOG_INFO, "Packet size: %d(%p)\n",
               packet.size, packet.data);
        unsigned char *yuv420_buf = (unsigned char *)malloc(3*640*480/2*sizeof(unsigned char));
        yuyv_to_yuv420p(packet.data, yuv420_buf, 640, 480);

        memcpy(frame->data[0], yuv420_buf, 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorAL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值