玩JavaCV和FFmpeg的视频 [英] Playing a video with JavaCV and FFmpeg
问题描述
所以,我正在开发一个定制的视频播放器Android版,但我需要多打了Android支持的视频文件(MP4,3GP ......),如对WMV,AVI,FLV。
在这个时候我已经转换任何视频类型的MP4,我能重新编码后打他们,但我不知道我怎么可以玩这些WMV,AVI文件,而无需重新编码它们的MP4。
有没有什么办法可以发挥在Android上任何视频而无需重新编写呢? JavaCV + FFmpeg的库已经工作,只是不知道该怎么做。
通过,我使用重新code视频的方式,继承人的code:
公共静态无效的转换(档案文件){
FFmpegFrameGrabber采集卡=
新FFmpegFrameGrabber(file.getAbsolutePath());
IplImage的captured_frame = NULL;
FrameRecorder记录= NULL;
记录=新FFmpegFrameRecorder(到/ mnt / SD卡/ external_sd / videosteste / primeiroteste.mp4,300,300);
recorder.setVideo codeC(13);
recorder.setFrameRate(30);
recorder.setFormat(MP4);
尝试 {
recorder.start();
frameGrabber.start();
而(真){
尝试 {
captured_frame = frameGrabber.grab();
如果(captured_frame == NULL){
的System.out.println(!!!失败cvQueryFrame);
打破;
}
recorder.record(captured_frame);
}赶上(例外五){
}
}
recorder.stop();
recorder.release();
}赶上(例外五){
e.printStackTrace();
}
}
首先创建CanvasFrame然后使用canvas.showImage(captured_frame);代替recorder.record(captured_frame);
下面是code:
公共类GrabberShow实现Runnable
{
最终静态INT间隔= 40; ///你可以使用间隔
IplImage的形象;
静态CanvasFrame帆布=新CanvasFrame(JavaCV播放器);
公共GrabberShow()
{
canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
公共静态无效的转换(档案文件)
{
FFmpegFrameGrabber采集卡=新FFmpegFrameGrabber(file.getAbsolutePath());
IplImage的captured_frame = NULL;
FrameRecorder记录= NULL;
//记录=新FFmpegFrameRecorder(到/ mnt / SD卡/ external_sd / videosteste / primeiroteste.mp4,300,300);
录音机=新FFmpegFrameRecorder(D://temp.mp4,300,300);
recorder.setVideo codeC(13);
recorder.setFrameRate(30);
recorder.setFormat(MP4);
尝试 {
recorder.start();
frameGrabber.start();
而(真){
尝试 {
captured_frame = frameGrabber.grab();
如果(captured_frame == NULL){
的System.out.println(!!!失败cvQueryFrame);
打破;
}
//recorder.record(captured_frame);
canvas.showImage(captured_frame);
视频下载(间隔);
}赶上(例外五){
}
}
recorder.stop();
recorder.release();
}赶上(例外五){
e.printStackTrace();
}
}
@覆盖
公共无效的run()
{
转换(新文件(D://aes.mp4));
}
公共静态无效的主要(字串[] args){
GrabberShow GS =新GrabberShow();
主题日=新主题(GS);
th.start();
}
}
So, I'm developing a custom video player for Android but I need to play more than the android supported video files (mp4, 3gp...), like wmv, avi, flv.
At this time I do already convert any video type to .mp4 and I'm able to play them after recoding, but I have no idea how can I play those wmv, avi files without recoding them to mp4.
Is there any way I can play any video on Android without recoding them? JavaCV + FFmpeg library already working, just don't know how to do that.
By the way, heres the code that I'm using to recode videos:
public static void convert(File file) {
FFmpegFrameGrabber frameGrabber =
new FFmpegFrameGrabber(file.getAbsolutePath());
IplImage captured_frame = null;
FrameRecorder recorder = null;
recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300);
recorder.setVideoCodec(13);
recorder.setFrameRate(30);
recorder.setFormat("mp4");
try {
recorder.start();
frameGrabber.start();
while (true) {
try {
captured_frame = frameGrabber.grab();
if (captured_frame == null) {
System.out.println("!!! Failed cvQueryFrame");
break;
}
recorder.record(captured_frame);
} catch (Exception e) {
}
}
recorder.stop();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
first you create the CanvasFrame then use "canvas.showImage(captured_frame);" instead of "recorder.record(captured_frame);"
Here is the code:
public class GrabberShow implements Runnable
{
final static int INTERVAL=40;///you may use interval
IplImage image;
static CanvasFrame canvas = new CanvasFrame("JavaCV player");
public GrabberShow()
{
canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
public static void convert(File file)
{
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath());
IplImage captured_frame = null;
FrameRecorder recorder = null;
//recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300);
recorder = new FFmpegFrameRecorder("D://temp.mp4", 300, 300);
recorder.setVideoCodec(13);
recorder.setFrameRate(30);
recorder.setFormat("mp4");
try {
recorder.start();
frameGrabber.start();
while (true) {
try {
captured_frame = frameGrabber.grab();
if (captured_frame == null) {
System.out.println("!!! Failed cvQueryFrame");
break;
}
//recorder.record(captured_frame);
canvas.showImage(captured_frame);
Thread.sleep(INTERVAL);
} catch (Exception e) {
}
}
recorder.stop();
recorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run()
{
convert(new File("D://aes.mp4"));
}
public static void main(String[] args) {
GrabberShow gs = new GrabberShow();
Thread th = new Thread(gs);
th.start();
}
}
这篇关于玩JavaCV和FFmpeg的视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!