ffmpeg 问题记录

简介: ffmpeg 问题记录

0、示例代码

private void outputMp4() {
    String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".mp4";
    log.info("文件上传到文件服务器开始,文件名:{}", fileName);
    try {
        BufferedImage img = ImageIO.read(videos.get(0));
        int width = img.getWidth();
        int height = img.getHeight();
        if (height % 2 != 0) {
            height++;
        }
        if (width % 2 != 0) {
            width++;
        }
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(fileName, width, height);
        log.info("有异常");
        // recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setVideoCodecName("libx264");
        recorder.setFrameRate(15.0);
        recorder.setVideoBitrate((int) ((width * height * 25.0) * 1 * 0.07));
        recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
        recorder.setFormat("mp4");
        recorder.start();
        log.info("2222222222");
        OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
        for (File f : videos) {
            opencv_core.IplImage image = cvLoadImage(f.getPath());
            recorder.record(conveter.convert(image));
            opencv_core.cvReleaseImage(image);
        }
        recorder.stop();
        recorder.release();
        File file = new File(fileName);
        videoName = fileStorageOperate.fileStorageUploadFile(file);
        log.info("文件上传到文件服务器完成,文件名:{}", fileName);
        file.delete();
    } catch (Exception e) {
        log.error("文件上传到文件服务器异常,文件名:{}", fileName);
        log.info(e.getMessage());
        try {
            BufferedImage img = ImageIO.read(videos.get(0));
            log.info(String.format("image1 width %d height %d", img.getWidth(), img.getHeight()));
        } catch (IOException e1) {
            log.info(e.getMessage());
        }
    }
}

    抛出异常

    avcodec_find_encoder() error_Video codec not found

    解决方式:寻码方式更改

    recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
    recorder.setVideoCodecName("libx264");

    1、安装yasm编译器

    在计算机领域中, Yasm是英特尔x86架构下的一个汇编器和反汇编器。它可以用来编写16位、32位(IA-32)和64位(x86-64)的程序。Yasm是一个完全重写的Netwide汇编器(NASM)。Yasm通常可以与NASM互换使用,并支持x86和x86-64架构。其许可协议为修订过的BSD许可证。截至2011年它由Peter Johnson和Michael Urman开发。

    下载地址:https://yasm.tortall.net/Download.html

    tar -xvzf yasm-1.3.0.tar.gz
    cd yasm-1.3.0/
    ./configure
    make && make install
    yasm --version

    2、安装x264 解码器

    H.264是MPEG4的第十部分,是一个标准。对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准, 两个专家组各有各的叫法,所以既叫H.264,也叫AVC。x264是一个编码器,他参照的标准是H.264。对头,H.264是需要付费的编码格式, 而x264是符合H.264标准的一个开源项目,是免费的, 也就是H264的一个简化版,不支持某些高级特性。但x264非常优秀,并不比H264的商业编码器差。

    下载地址:git clone http://git.videolan.org/git/x264.git

    解压命令 安装 yum -y install bzip2 解压 tar -xvf x264-master.tar.bz2 重命名 mv x264-master x264

    ./configure --prefix=/usr/local/ffmpeg/x264 --enable-shared --enable-static --disable-asm
    make && make install

    3、安装ffmpeg

    视频处理最常用的开源软件。它功能强大,用途广泛, 大量用于视频网站和商业软件(比如 Youtube 和 iTunes), 也是许多音频和视频格式的标准编码/解码实现。

    下载地址:https://ffmpeg.org/download.html

    解压命令
    tar xvJf ffmpeg-4.1.tar.xz
    重命名
    mv ffmpeg-4.1 ffmpeg
    ./configure --prefix=/usr/local/ffmpeg/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/ffmpeg/x264/include --extra-ldflags=-L/usr/local/ffmpeg/x264/lib


    make && make install

    4、完成验证

    ffmpeg   ffplay
    ffmpeg -version
    cd /usr/local/ffmpeg/ffmpeg/bin
    ./ffmpeg -version           查看安装版本/是否安装成功【可选】
    ./ffmpeg -encoders |grep 264 检查是否安装H264成功
    ./ffmpeg -decoders |grep 246 检查是否安装H264成功
    ffmpeg -decoders  //列出可用的解码器   H264  H265
    ffmpeg -encoders  //列出可用的编码器
    ffmpeg -devices   //列出可支持的设备

    5、卸载

    sudo make uninstall hash -r rm -rf 删除相关命令

    6、问题解决

    ./ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory


    ./ffmpeg: error while loading shared libraries: libx264.so.161: cannot open shared object file: No such file or directory

    打开这个文件

    sudo vim /etc/ld.so.conf

    在后面添加以下自己的路径

    /usr/local/ffmpeg/ffmpeg/lib
    /usr/local/ffmpeg/x264/lib

    修改完了就保存,然后在运行


    sudo ldconfig -v
    目录
    相关文章
    |
    SQL 存储 数据可视化
    Ganos矢量快显功能上手系列2:增强的MVT能力
    本文主要介绍Ganos新增的2D矢量动态切片函数及其使用方法。新增的矢量动态切片函数能够大幅提升可视化效率,有效解决小比例尺MVT显示耗时久的问题。和PostGIS相比,小比例尺MVT的可视化效率提升可达60%以上。
    |
    9月前
    |
    监控 数据可视化 数据挖掘
    远程团队协作的难点与解决方案
    随着远程工作的普及,团队协作效率成为企业竞争力的关键。本文从优化流程、选择合适工具和改进协作方法三方面详细分析如何提升远程团队效率。通过明确工作流程、推行敏捷方式、采用数据驱动决策、选择易用且集成的工具、建立高效沟通机制及培养团队信任等措施,帮助团队在远程环境中高效运作。最终,通过制定绩效指标、定期反馈和数据化成果展示来衡量协作效率的提升。
    |
    11月前
    |
    缓存 数据库 Android开发
    安卓开发中的性能优化技巧
    【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
    257 3
    |
    Java API Apache
    项目构建时抛出LoggerContextShutdownAware log 错误问题处理
    SpringBoot应用的日志显示它尝试初始化Skywalking日志目录为/app/logs/skywalking。随后,应用程序一个异常,具体是`java.lang.reflect.InvocationTargetException`。问题可能是由于日志库的冲突或缺失导致的。建议检查项目中是否存在与SpringBoot内置日志系统冲突的自定义日志配置,并确保所有必要的日志依赖,如log4j-core和log4j-api,都已正确且版本匹配地引入。通过解决这些冲突并重新构建,应该可以解决这个问题。
    300 0
    |
    存储 搜索推荐 数据可视化
    分享100+个搜索引擎,看看你知道的有几个
    分享100+个搜索引擎,看看你知道的有几个
    1668 0
    分享100+个搜索引擎,看看你知道的有几个
    |
    12月前
    【寄存器开发速成】半小时入门STM32寄存器开发(二)
    【寄存器开发速成】半小时入门STM32寄存器开发(二)
    221 0
    |
    C++
    Vscode 内存过高的解决办法
    Vscode 内存过高的解决办法
    2039 0
    |
    关系型数据库 Linux 网络安全
    "Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
    【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
    853 0
    |
    缓存 NoSQL Java
    一个轻量级 Java 权限认证框架——Sa-Token
    Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
    |
    存储 JSON JavaScript
    glTF和GLB有什么区别?
    glTF和GLB有什么区别?
    692 0