CentOS 由 JavaCPP 转让 FFMPEG

1. Java 与 FFMPEG

FFMPEG 它是一种广泛使用的媒体处理库,于Java天地,处理视频较弱的能力,因此,有非常大的需求需求Java 转让 FFMPEG。

Java 转让C 的方式有非常多。能够用最原始的JNI方式,也能够JNA方式。还能够是命令行。

採用命令行的方式比較简单。只是有非常大局限性,尤其是涉及到 视频的处理和分析的时候。比方要取出某个packet,然后进行处理。

这里介绍的是用JavaCPP 调用 ffmpeg 库的方式。而不是命令行模式。

JavaCPP的源代码在这里:https://github.com/bytedeco/javacpp

基于JavaCPP的项目

1)JavaCV。是做图形图像的,有人脸识别、增强现实AR 等开源算法,很不错

项目主页是:https://github.com/bytedeco/javacv

2)JavaAV 封装了FFMPEG的java 接口

项目主页:https://github.com/hoary/JavaAV

2.  JavaCPP Presets

为了方便使用,JavaCPP以下有个presets项目,主页是 https://github.com/bytedeco/javacpp-presets。将一些经常使用的项目都编译好了以方便使用。

集成的项目包含:

? OpenCV 2.4.9 http://opencv.org/downloads.html

? FFmpeg 2.3.x http://ffmpeg.org/download.html

? FlyCapture 2.6.x http://ww2.ptgrey.com/sdk/flycap

? libdc1394 2.1.x or 2.2.x http://sourceforge.net/projects/libdc1394/files/

? libfreenect 0.5 https://github.com/OpenKinect/libfreenect

? videoInput 0.200 https://github.com/ofTheo/videoInput/tree/update2013

? ARToolKitPlus 2.3.0 https://launchpad.net/artoolkitplus

? flandmark 1.07 http://cmp.felk.cvut.cz/~uricamic/flandmark/#download

? FFTW 3.3.4 http://www.fftw.org/download.html

? GSL 1.16 http://www.gnu.org/software/gsl/#downloading

? LLVM 3.4.2 http://llvm.org/releases/download.html

? Leptonica 1.71 http://www.leptonica.org/download.html

? Tesseract 3.03-rc1 https://code.google.com/p/tesseract-ocr/

包括的平台有:   android-arm, android-x86, linux-x86, linux-x86_64, macosx-x86_64, windows-x86, windows-x86_64,

但须要注意:这里的 linux-x86_64 是 基于Fedora 平台的,无法在 CentOS下使用。

3. 在CentOS下编译

1)安装JDK

2)安装 apache-maven 2/3

3) 安装 gcc,gcc+,gcc-c++,yasm

yum -y install yasm gcc+ gcc-c++

4)  获取源代码

git clone http://github.com/bytedeco/javacpp-presets

5)  编译 ffmpeg

cd javacpp-presets/

./cppbuild.sh -platform linux-x86_64 install ffmpeg

6) 编译 jni 和 相关jar

mvn install --projects ffmpeg

7) 编译完毕后。会在 ffmpeg 的lib上生成相关 .so 。javacpp-presets/targets 下生成相关的jar

4. 測试

1) 将相关的 .so 拷贝到 /lib64 文件夹下,或者通过 -Djava.library.path 指定到.so 所在文件夹

2) 拷贝一个实例用来測试。

public class Tutorial01 {

	static void SaveFrame(AVFrame pFrame, int width, int height, int iFrame)
			throws IOException {
		// Open file
		OutputStream stream = new FileOutputStream("frame" + iFrame + ".ppm");

		// Write header
		stream.write(("P6\n" + width + " " + height + "\n255\n").getBytes());

		// Write pixel data
		BytePointer data = pFrame.data(0);
		byte[] bytes = new byte[width * 3];
		int l = pFrame.linesize(0);
		for (int y = 0; y < height; y++) {
			data.position(y * l).get(bytes);
			stream.write(bytes);
		}

		// Close file
		stream.close();
	}

	public static void main(String[] args) throws IOException {
		AVFormatContext pFormatCtx = new AVFormatContext(null);
		int i, videoStream;
		AVCodecContext pCodecCtx = null;
		AVCodec pCodec = null;
		AVFrame pFrame = null;
		AVFrame pFrameRGB = null;
		AVPacket packet = new AVPacket();
		int[] frameFinished = new int[1];
		int numBytes;
		BytePointer buffer = null;

		AVDictionary optionsDict = null;
		SwsContext sws_ctx = null;

		if (args.length < 1) {
			args = new String[] { "/root/test.ts" };
			// System.out.println("Please provide a movie file");
			// System.exit(-1);
		}
		// Register all formats and codecs
		av_register_all();

		// Open video file
		if (avformat_open_input(pFormatCtx, args[0], null, null) != 0) {
			System.exit(-1); // Couldn't open file
		}

		// Retrieve stream information
		if (avformat_find_stream_info(pFormatCtx, (PointerPointer) null) < 0) {
			System.exit(-1); // Couldn't find stream information
		}

		// Dump information about file onto standard error
		av_dump_format(pFormatCtx, 0, args[0], 0);

		// Find the first video stream
		videoStream = -1;
		for (i = 0; i < pFormatCtx.nb_streams(); i++) {
			if (pFormatCtx.streams(i).codec().codec_type() == AVMEDIA_TYPE_VIDEO) {
				videoStream = i;
				break;
			}
		}
		if (videoStream == -1) {
			System.exit(-1); // Didn't find a video stream
		}

		// Get a pointer to the codec context for the video stream
		pCodecCtx = pFormatCtx.streams(videoStream).codec();

		// Find the decoder for the video stream
		pCodec = avcodec_find_decoder(pCodecCtx.codec_id());
		if (pCodec == null) {
			System.err.println("Unsupported codec!");
			System.exit(-1); // Codec not found
		}
		// Open codec
		if (avcodec_open2(pCodecCtx, pCodec, optionsDict) < 0) {
			System.exit(-1); // Could not open codec
		}

		// Allocate video frame
		pFrame = av_frame_alloc();

		// Allocate an AVFrame structure
		pFrameRGB = av_frame_alloc();
		if (pFrameRGB == null) {
			System.exit(-1);
		}

		// Determine required buffer size and allocate buffer
		numBytes = avpicture_get_size(AV_PIX_FMT_RGB24, pCodecCtx.width(),
				pCodecCtx.height());
		buffer = new BytePointer(av_malloc(numBytes));

		sws_ctx = sws_getContext(pCodecCtx.width(), pCodecCtx.height(),
				pCodecCtx.pix_fmt(), pCodecCtx.width(), pCodecCtx.height(),
				AV_PIX_FMT_RGB24, SWS_BILINEAR, null, null,
				(DoublePointer) null);

		// Assign appropriate parts of buffer to image planes in pFrameRGB
		// Note that pFrameRGB is an AVFrame, but AVFrame is a superset
		// of AVPicture
		avpicture_fill(new AVPicture(pFrameRGB), buffer, AV_PIX_FMT_RGB24,
				pCodecCtx.width(), pCodecCtx.height());

		// Read frames and save first five frames to disk
		i = 0;
		while (av_read_frame(pFormatCtx, packet) >= 0) {
			// Is this a packet from the video stream?
			if (packet.stream_index() == videoStream) {
				// Decode video frame
				avcodec_decode_video2(pCodecCtx, pFrame, frameFinished, packet);

				// Did we get a video frame?
				if (frameFinished[0] != 0) {
					// Convert the image from its native format to RGB
					sws_scale(sws_ctx, pFrame.data(), pFrame.linesize(), 0,
							pCodecCtx.height(), pFrameRGB.data(),
							pFrameRGB.linesize());

					// Save the frame to disk
					if (++i <= 5) {
						SaveFrame(pFrameRGB, pCodecCtx.width(),
								pCodecCtx.height(), i);
					}
				}
			}

			// Free the packet that was allocated by av_read_frame
			av_free_packet(packet);
		}

		// Free the RGB image
		av_free(buffer);
		av_free(pFrameRGB);

		// Free the YUV frame
		av_free(pFrame);

		// Close the codec
		avcodec_close(pCodecCtx);

		// Close the video file
		avformat_close_input(pFormatCtx);

		System.exit(0);
	}
}

4)执行实例,得到输出结果:

Input #0, mpegts, from ‘/root/test.ts‘:

Duration: 00:03:20.02, start: 0.056778, bitrate: 1455 kb/s

Program 1

Metadata:

service_name    : jVideo

service_provider: jTeam

Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc

Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 66 kb/s

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-11 19:13:21

CentOS 由 JavaCPP 转让 FFMPEG的相关文章

CentOS 下通过 JavaCPP 调用 FFMPEG

1. Java 与 FFMPEG FFMPEG 是一个广泛用于媒体处理的库,在Java的世界里,处理视频的能力相当弱,于是有很大需求需要Java 调用 FFMPEG. Java 调用C 的方式有很多,可以用最原始的JNI方式,也可以JNA方式,还可以是命令行. 采用命令行的方式比较简单,不过有很大局限性,尤其是涉及到 视频的处理和分析的时候,比如要取出某个packet,然后进行处理. 这里介绍的是用JavaCPP 调用 ffmpeg 库的方式,而不是命令行模式. JavaCPP的源码在这里:ht

CentOS下yum安装FFmpeg

一.yum安装FFmpeg 1.    最偷懒的方式就是yum安装了,自动解决依赖.不过CentOS系统默认无FFmpeg源,企业版 Linux 附加软件包EPEL源也不包含,需要手动添加yum源配置/etc/yum.repos.d/dag.repo:   [dag] name=Dag RPM Repository for Red Hat Enterprise Linux baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag

CentOS安装视频转换FFmpeg和切割工具segmenter

一.yum安装FFmpeg 1.    最偷懒的方式就是yum安装了,自动解决依赖.不过CentOS系统默认无FFmpeg源,企业版 Linux 附加软件包EPEL源也不包含,需要手动添加yum源配置/etc/yum.repos.d/dag.repo: [dag] name=Dag RPM Repository for Red Hat Enterprise Linux baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag g

centOS下快速安装FFMPEG

因为项目需求要用到FFMPEG做一些音频处理(虽然也就压MP3封面, 音频压缩的简单功能), 在MAC下面安装的很顺利, 但是到了阿里云的centOS下面安装各种痛苦, google一搜索,如果自己从源码安装编译, 整个流程都2页, 按照流程做还各种报错, 安装太麻烦了, 要解决的问题太多. 继续搜索,运气比较好找到一个方法能很快速度安装的, 安装出来的版本不知道完不完整,不过足够做一些简单的音频处理 https://www.centos.org/forums/viewtopic.php?f=4

CentOS 6/7安装ffmpeg

环境 CentOS 6/7 安装 导入GPG key rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms 安装ATRPMS Repo rpm -ivh http://dl.atrpms.net/all/atrpms-repo-6-7.el6.x86_64.rpm 选择ATRPMS Repo安装ffmpeg yum -y --enablerepo=atrpms install ffmpeg ffmpeg-devel 验证ffmpeg

linux(centos)下安装ffmpeg

[备忘]windows环境下20行php代码搞定音频裁剪 上次我的这篇文章将了windows下web中如何操作ffmpeg的文章,这里则记录下linux(centos)下的安装 首先:我花了中午大概1个小时的时间安装它,失败了 然后下午找公司的运维帮忙安装,安装了2-3个小时,都没装完,我就回座位继续码代码了... 一会儿运维微信我,说让我再提供台机子给他,他找到了一个快捷的安装方式,就是下面转载的内容(测试可用) 看到一句话,会心的笑了一下:网上搜索源码编译ffmpeg,看来安装这么多的软件包

CentOS yum方式安装ffmpeg

系统为CentOS 6.4,自己编译ffmpeg和众多解码器太痛苦了,yum方式安装ffmpeg的解码器很全,先用用看. 1.安装所需软件? yum install -y automake autoconf libtool gcc gcc-c++ 2.安装第三方更新源? rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.i686.rpm 3.安装ffmpeg? yu

Centos 6.6 的FFmpeg简单安装文档

一.安装工具包   yum install -y automake autoconf libtool gcc gcc-c++ 所有安装包的下载地址:http://pan.baidu.com/s/1hriJB5U 二.安装具体步骤 1.lame wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz (安装lame-3.99.5.tar.gz, 以免在第三步的时候出现ERROR:libmp3la

How to install ffmpeg,mp4box,mplayer,mencoder,flvtool2,ffmpeg-php on centos

1. Enable RPM Fusion yum repository The CentOS rpm packages of ffmpeg, mplayer, mencoder and MP4Box are available on RPM Fusion YUM repository. RPM Fusion repo depends on packages from EPEL repo. So enable these repositories by installing following R