使用 JavaCV 和 FFmpeg 播放视频
Posted
技术标签:
【中文标题】使用 JavaCV 和 FFmpeg 播放视频【英文标题】:Playing a video with JavaCV and FFmpeg 【发布时间】:2012-12-07 20:18:26 【问题描述】:所以,我正在为 android 开发一个自定义视频播放器,但我需要播放的不仅仅是 android 支持的视频文件(mp4, 3gp...), like wmv, avi, flv.
此时我已经将任何视频类型转换为 .mp4 并且我能够在重新编码后播放它们,但我不知道如何播放这些 wmv
、avi
文件而不将它们重新编码为 @ 987654324@视频格式。
有什么方法可以在 Android 上播放任何视频而无需重新编码?
JavaCV
+ FFmpeg
库已经在工作,只是不知道该怎么做。
顺便说一下,这是我用来重新编码视频的代码:
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();
【问题讨论】:
我已经搜索了很长时间,但仍然没有答案。有人吗? 【参考方案1】:首先创建 CanvasFrame,然后使用“canvas.showImage(captured_frame);”而不是“recorder.record(captured_frame);”
代码如下:
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();
【讨论】:
他问了android,我想你回答了abput desktop app【参考方案2】:有什么方法可以在 Android 上播放任何视频而无需重新编码?
你为什么要录制视频?无需录制视频。 JavaCv。
这是为您提供想法的示例代码,您可以如何实现它。
FrameGrabber grabber = new FrameGrabber(videoFile);
grabber.start();
BufferedImage image= null;
while((image=grabber.grab())!=null)
// TODO set the image on the canvas or panel where ever you want.
grabber.stop();
【讨论】:
以上是关于使用 JavaCV 和 FFmpeg 播放视频的主要内容,如果未能解决你的问题,请参考以下文章
使用 Audiotrack 在 Android 中播放 javacv-ffmpeg 解码的音频
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频
JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频
JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频