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