从源码编译支持ffmpeg(H264编码)的opencv(创建mp4视频报错:H264 is not supported with codec id 28)

目录

[步骤 1:安装 FFmpeg](#步骤 1:安装 FFmpeg)

[在 Ubuntu 上安装 FFmpeg](#在 Ubuntu 上安装 FFmpeg)

[在 Windows 上安装 FFmpeg](#在 Windows 上安装 FFmpeg)

验证FFmpeg是否支持H264编码

[步骤 3:克隆 OpenCV 源码](#步骤 3:克隆 OpenCV 源码)

[步骤 4:编译](#步骤 4:编译)

[步骤 5:验证安装](#步骤 5:验证安装)

本人的配置如下:

  • 系统:Ubuntu 18.04
  • 需要编译的opencv版本:3.4.8

为啥要支持H264视频编码的opencv?

  1. 定义

    H.264 是一种视频编码标准,也称为 AVC(Advanced Video Coding),由国际电信联盟(ITU)和国际标准化组织(ISO)共同开发。它是一种压缩视频数据的标准,广泛应用于各种视频格式,如 Blu-ray、在线视频流(如 YouTube)、视频会议等。

  2. 功能

    H.264 提供了高效的视频压缩算法,能够在相对较低的比特率下保持高质量的视频。它支持多种分辨率和帧率,并能够在不同的网络条件下进行流式传输。

  3. 应用

    H.264 被广泛用于视频播放、视频流媒体、广播电视、视频会议等领域。

H264与X264的区别?

  1. 定义

    X264 是 H.264 编码标准的一个开源实现。它是一个软件库,允许用户将视频编码为 H.264 格式。X264 是由 VideoLAN 项目开发的,提供了高效的 H.264 编码功能。

  2. 功能

    X264 提供了多种编码选项和参数,使用户能够根据需求调整编码质量、速度和文件大小。它支持多线程编码,可以充分利用多核处理器,提高编码效率。

  3. 应用

    X264 通常用于视频处理和编码软件中,如 FFmpeg、HandBrake 等。由于其高效和灵活性,X264 是业界最常用的 H.264 编码器之一。

步骤 1:安装 FFmpeg

在 Ubuntu 上安装 FFmpeg
复制代码
sudo apt update
sudo apt install ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev

本人尝试过从源码安装的ffmpeg,opencv还是无法支持h264的编码,安装方式:

复制代码
sudo apt install build-essential git cmake pkg-config
sudo apt install libjpeg-dev libpng-dev libtiff-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavdevice-dev
sudo apt install libgtk2.0-dev libgtk-3-dev libatlas-base-dev gfortran
sudo apt install libx264-dev
sudo apt install yasm

cd ffmpeg
git checkout n3.4.11
./configure --enable-gpl --enable-libx264 --enable-nonfree
make -j8
sudo make install
sudo make uninstall #卸载ffmpeg
在 Windows 上安装 FFmpeg
  1. 下载 FFmpeg 的预编译版本:FFmpeg Downloads
  2. 解压缩并将 bin 目录添加到系统的环境变量中。
验证FFmpeg是否支持H264编码

方式1:

复制代码
# 验证是否成功安装ffmpeg
ffmpeg -version

# 验证是否支持H264编码
ffmpeg -codecs | grep h264

如果支持会出现信息:DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

方式2:

就是用ffmpeg将一个视频转为H264格式。

复制代码
# 转视频格式
ffmpeg -i input.mp4 -vcodec h264 output.mp4
# 查看视频格式
ffmpeg -i output.mp4

步骤 3:克隆 OpenCV 源码

使用 Git 克隆 OpenCV 和 OpenCV 贡献模块(可选):

复制代码
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 3.4.8

cd ..
git clone https://github.com/opencv/opencv_contrib.git

步骤 4:编译OpenCV

在 OpenCV 源码目录中创建一个构建目录:

复制代码
# install eigen(可选)
sudo apt install libeigen3-dev

cd opencv
mkdir build
cd build

cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
      -D WITH_FFMPEG=ON \
      -D WITH_EIGEN=ON \
      -D WITH_X264=ON \
      ..
make -j8
sudo make install

步骤 5:验证安装

可以使用以下命令验证 OpenCV 是否正确安装并支持 FFmpeg,如果FFMPEG字段下全为YES则表示支持ffmpeg:

复制代码
# 在opencv的安装目录下的bin目录下执行:
./opencv_version -verbose

然后编写一个简单的 OpenCV 程序来测试视频读取和编码功能**,注意新视频后缀必须为mkv,原因是opencv内部会根据后缀名称猜测一个编码格式(调用的ffmpeg接口:av_guess_format,只有mkv后缀才会返回h264编码格式),如果该格式跟传入的H264格式不一致则会报错:H264 is not supported with codec id 28**.(可能是opencv的bug吧)

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include<vector>
#include<string>

int main() {
    // 视频读取
    std::vector<cv::Mat> frames;
    cv::VideoCapture cap("video.mp4"); // 替换为你的视频文件路径
    if (!cap.isOpened()) {
        std::cerr << "Error: Could not open video." << std::endl;
        return -1;
    }
    cv::Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty()) break;
        frames.push_back(frame);
    }
    cap.release();

    // 用H264格式编码视频
    std::string pathsave="output.mkv";//注意这里的后缀必须为mkv,否则会出现:H264 is not supported with codec id 28
    int w=frames[0].cols;
    int h=frames[0].rows;
    cv::VideoWriter writer(pathsave,cv::VideoWriter::fourcc('H','2','6','4'),30,cv::Size(w,h));
    if(!writer.isOpened()){
        std::cerr<<"Error:Could not open the output video file."<<std::endl;
        return 0;
    }
    for(auto fr:frames){
        writer.write(fr);
    }
    writer.release();
    return 0;
}

其他参考:

https://zhuanlan.zhihu.com/p/566332513

相关推荐
Cheney82213 分钟前
华为Ai岗机考20250903完整真题
人工智能·华为
新智元19 分钟前
=COPILOT() 函数横空出世!AI 自动写公式效率起飞,网友:让 Excel 再次伟大
人工智能·openai
scx_link26 分钟前
Word2Vec词嵌入技术和动态词嵌入技术
人工智能·自然语言处理·word2vec
云梦谭28 分钟前
Cursor 编辑器:面向 AI 编程的新一代 IDE
ide·人工智能·编辑器
IT_陈寒37 分钟前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
乐迪信息44 分钟前
乐迪信息:AI摄像机在智慧煤矿人员安全与行为识别中的技术应用
大数据·人工智能·算法·安全·视觉检测
AI人工智能+44 分钟前
炫光活体检测技术:通过光学技术实现高效、安全的身份验证,有效防御多种伪造手段。
人工智能·深度学习·人脸识别·活体检测
咔咔一顿操作1 小时前
第七章 Cesium 3D 粒子烟花效果案例解析:从原理到完整代码
人工智能·3d·信息可视化·cesium
微三云-轩1 小时前
区块链:重构企业数字化的信任核心与创新动力
人工智能·小程序·区块链·生活·我店
君名余曰正则1 小时前
机器学习04——决策树(信息增益、信息增益率、ID3、C4.5、CART、剪枝、连续值缺失值处理)
人工智能·决策树·机器学习