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
    目录
    相关文章
    |
    存储 Cloud Native Linux
    音视频 FFmpeg如何查询命令帮助文档
    音视频 FFmpeg如何查询命令帮助文档
    |
    存储 Cloud Native Linux
    音视频 ffmpeg命令分类查询
    音视频 ffmpeg命令分类查询
    |
    9月前
    ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
    ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
    215 0
    |
    9月前
    |
    编解码 安全 计算机视觉
    FFMPEG常用命令 音视频合并
    FFMPEG常用命令 音视频合并
    265 2
    |
    编解码 编译器 C语言
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(一)
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(一)
    2371 0
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(一)
    使用downloadm3u8和ffmpeg下载m3u8格式视频
    使用downloadm3u8和ffmpeg下载m3u8格式视频
    181 0
    |
    编解码
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )
    215 0
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(二)
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(二)
    274 0
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(二)
    |
    编解码
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(三)
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(三)
    187 0
    【FFmpeg】ffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )(三)
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(六)
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(六)
    556 0
    【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )(六)

    热门文章

    最新文章