JavaCV + FFmpeg 拉流播放器

视频抽帧实现 视频基本内容了解,视频抽帧实践 阅读详情

一、设计方案

一个简单的拉流播放器,需要具备以下功能:

  1. 将直播流拉取到设备上并展现出来
  2. 保证播放当前直播流的音视频是同步的
  3. 播放视频时可以切换全屏幕与非全屏

二、定义播放器的生命周期

在定义播放器的生命周期们需要做到以下两步:

1. 先定义一下播放器的事件   

2. 定义播放器展示的控件

1. 定义播放器事件

一个播放器,需要定义出来相应的播放器的事件,最基本的播放器的操作就是:播放、暂停、停止。示例代码如下:

/**
 * 播放器抽象类
 */
public abstract class Player {

    protected boolean play = false;

    public void play() {
        this.play = true;
    }

    public void pause() {
        this.play = false;
    }

    public void stop() {
        this.play = false;
    }
}

2. 定义SurfaceView来显示拉取的视频流

这里其实和原生的MediaPlayer及Ijkplayer是一样的,都是监听Surface的状态来控制播放器:创建,暂停,停止并release。

这里我们使用的控件是SurfaceView,创建一个VideoSurfaceView继承SurfaceView,并实现SurfaceHolder.Callback接口:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    initLayout(mPlayer.getWidth(), mPlayer.getHeight());
    play();
    if (onPreparedListener != null) onPreparedListener.onPrepared();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Log.v(TAG, "surfaceChanged...");
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mPlayer.pause();
}

public void releasePlayer() {
    mPlayer.stop();
}

到这里我们把基本的播放器的生命周期的控制部分完成了,接下来就是完成基本的音视频数据的获取和播放了。

三、使用JavaCV + FFmpeg的API播放拉取音视频流

我们使用的是 JavaCV + FFmpeg的API,关于JavaCV的基本的介绍在上一篇文章 JavaCV入门 里面已经做了,下面一边介绍使用到的核心类一边说明音视频播放的流程:

1. FFmpegFrameGrabber

所在package包为:org.bytedeco.javacv,完整类名为:org.bytedeco.javacv.FFmpegFrameGrabber

FFmpegFrameGrabber可以理解为解码器,也可以理解为帧收集器,主要作用就是将视频流以帧的形式拉去到手机设备上。

mFrameGrabber = FFmpegFrameGrabber.createDefault(path);

上面的代码就是创建FFmpegFrameGrabber的方式,path就是要拉取流的地址。

mFrameGrabber.setPixelFormat(AV_PIX_FMT_RGBA);

设置帧收集时的像素格式,这块设置AV_PIX_FMT_RGBA的原因主要是,我们展示画面的时候是转换为Bitmap格式的。

mFrameGrabber.setOption("fflags", "nobuffer");

上面的代码表示我们可以像ijkplayer一样,设置一些参数,这些参数格式我们可以参考ijkplayer也可以去ffmpeg命令行的一些设置参数文档里面去查找,这里就不多赘述了。

mFrameGrabber.start();

上面的代码就是让帧收集器启动,这样就开始拉流了。

2. Frame

所在package包为:org.bytedeco.javacv,完整类名为:org.bytedeco.javacv.Frame

Frame 是一个用于管理音频和视频帧数据的类。 在CanvasFrame、FrameGrabber、FrameRecorder及他们的子类里面都有用到。

Frame grabframe = mFrameGrabber.grab(); 

上面的代码表示从帧收集器里面抓去最新的帧:

播放音频:grabframe.samples里面获取到的就是原始的pcm音频数据,交给AudioTrack处理就ok了。

播放视频:首先需要将Frame图像转换为Bitmap,AndroidFrameConverter.convert(frame)就可以转换,但是在这之前需要使用OpenCVFrameConverter.ToIplImage将抓出来的Frame转换一下。

Canvas canvas = mHolder.lockCanvas();
canvas.drawBitmap(bmp, null, new Rect(0, 0, canvas.getWidth(), frame.imageHeight * canvas.getWidth() / frame.imageWidth), null);
mHolder.unlockCanvasAndPost(canvas);

上面的代码表示将获取到的位图绘制到SurfaceHolder里面去,这里建议启动线程去绘制,这样效率会高很多。

javacv从入门到精通——第十三章javacv中FFmpegFrameGrabber的start方法执行时间过长,怎么优化? 如何优化javacv中FFmpegFrameGrabber的start方法执行时间 阅读详情

相关推荐

JavaCV与FFmpeg:音视频流处理技巧

JavaCV是一个开源的Java接口,为OpenCV、FFmpeg和其他类似工具提供了封装。它允许Java开发者直接在他们的应用程序中使用这些强大的本地库,而无需深入了解复杂的本地代码。JavaCV特别适用于处理图像和视频数据,提供了一系列的功能,如图像捕获、处理和视频编解码。FFmpeg是一个非常强大的多媒体框架,能处理几乎所有格式的音频和视频。它包括了一系列转码、流处理和播放的工具。在JavaCV中,FFmpeg被用于处理视频流的编码和解码。

qq_38334677的博客 6030

Spring Boot 多媒体(音频/视频)文件处理FFmpegFrameGrabber 方法(例子:获取视频总时长)

以上是FFmpegFrameGrabber类提供的一些常用方法,通过这些方法可以实现对多媒体文件的读取、解析和处理。备注:业务逻辑需要根据自己的情况更改。

qq_53722480的博客 6260

代谢组学数据分析实战:用R语言从PCA、PLS-DA到OPLS-DA一步步搞定(附代码)

本文详细介绍了使用R语言进行代谢组学数据分析的全流程,从数据预处理到PCA、PLS-DA和OPLS-DA模型构建与验证。通过实际案例和代码示例,帮助研究者掌握关键分析技术,提升数据解读能力,特别适合生命科学领域的研究人员。

weixin_28689507的博客 133

javacv从入门到精通进阶——第八章:视频流处理

这份javacv学习大纲主要分为入门、进阶和高级三个部分,其中入门部分包括了javacv的概述、环境搭建和基础应用;进阶部分则讲解了图像和视频处理、音频处理以及opencv的结合等内容;而高级部分则进一步深入了解了实时视频流处理、深度学习和人工智能等领域的应用。学习本大纲能够掌握使用javacv进行图像和视频处理、音频处理、实时视频流处理以及深度学习等领域的知识和应用。

ayou_llf的博客 1万+

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 393

AD9361 RSSI配置实战:从寄存器到精准功率测量的避坑指南

本文详细解析了AD9361芯片的RSSI配置实战,从寄存器设置到精准功率测量的全流程避坑指南。通过优化模式选择、测量持续时间及高级参数配置,实现高精度信号强度测量,并分享实际项目中的校准流程与性能优化技巧,帮助工程师提升射频接收链路的测量精度。

weixin_38166557的博客 443

JavaCV 学习(二):使用 JavaCV + FFmpeg 制作拉流播放器

一、前言   在Android 音视频开发学习思路中,我们不断的学习和了解音视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来。这样才能得到更深层次的领悟。通过整理Android 音视频开发(一) : 通过三种方式绘制图片我们知道可以使用ImageView和SurfaceView甚至是View来展示图片,通过整理Android 音视频开发(...

weixin_30512043的博客 1371

信噪比(Signal-to-Noise Ratio, SNR)详细介绍

信噪比(Signal-to-Noise Ratio,SNR)是衡量信号质量的重要参数,表示有用信号的功率与背景噪声功率的比值。其中,\( P_{\text{signal}} \) 表示信号功率,\( P_{\text{noise}} \) 表示噪声功率。- 音频处理:在音频设备和录音系统中,SNR决定了音质的好坏,高SNR表示音频信号更清晰,噪声更少。- 低SNR:信号中噪声成分较大,接收端难以分辨有用信号和噪声,可能导致误码率高,通信质量差。SNR定义为信号功率与噪声功率之比,通常用分贝(dB)表示。

qq_58860480的博客 8万+

Android 视频播放器 (三):使用NBPlayer播放直播视频

一、前言   在Android 音视频开发学习思路中,我们不断的学习和了解音视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来。这样才能得到更深层次的领悟。通过整理Android 音视频开发(一) : 通过三种方式绘制图片我们知道可以使用ImageView和SurfaceView甚至是View来展示图片,通过整理Android 音视频开发(...

weixin_30836759的博客 215

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3058

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3871

StringBoot 通过FFmpegFrameGrabber获取视频首帧作为图片展示

FFmpegFrameGrabber获取视频首帧作为图片展示

qq_46100517的博客 7294

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

FFmpegFrameGrabber视频抽帧工具类

通过视频链接进行关键帧抽取图片,核对利用FFmpegFrameGrabber对视频流进行抽帧处理。

共同见证AI,未来一起成长 5127

论文学习——Connected Speech-Based Cognitive Assessment in Chinese and English——TAUKADIAL挑战赛介绍

这个比赛很有意义,因为目前AD检测的主要问题就是数据集过少,大部分数据集都是英语数据集,但是实际上很多患者分布在非英语的国家,所以需要解决多语种数据小的问题。这个比赛刚好是解决了英语检测样本和中文检测样本的问题,不过Baseline做的实在不够高明,对于语义信息的提取还是需要再进一步改良的。 这篇文章主要是对这个数据集了解的更加深刻,方便以后自己做科研!加油!趁现在,抓紧把论文写完!

Blackoutdragon的博客 1909

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

#JavaCV 中 FFmpegFrameGrabber 使用时的一些注意事项

1、grabber.start()阻塞的解决方案         假设有如下代码,从Socket中读取视频流并显示。 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(clientSocket.getInputStream()); grabber.setFormat("h264"); grabber.setOption("rtsp_transport", "tcp"); gr

投笔丶从戎的博客 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java后台,视频截取某一帧图片并保存

FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault("视频地址"); ff.start(); int ffLength = ff.getLengthInFrames(); Frame f; String pngPath = ""; int i = 0; while (i < ffLength) { f = ff.grab...

醉逸鎏年的博客 2804

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ffmpeg java 播放视频_Javacv使用ffmpeg实现音视频同步播放

最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放。采用的同步方法是视频向音频同步。具体的思路如下:(1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的FFmpegFrameGrabber fg = new FFmpegFrameGrabber("a video file path or a url);得到帧捕捉器对象后,调...

weixin_34652847的博客 1296

【java】JavaCV中FFmpegFrameGrabber调用start()方法时出现阻塞的解决办法

【java】JavaCV中FFmpegFrameGrabber调用start()方法时出现阻塞的解决办法

6734

FFmpeg+javacpp中FFmpegFrameGrabber

1、FFmpegFrameGrabber org\bytedeco\javacv\FFmpegFrameGrabber.java

许浑的博客 916

FFMPEG 参数详细说明

FFMPEG 3.4.1 版本参数详细说明 用法:ffmpeg [options] [[infile options] -i infile] … {[outfile options] outfile} …  获得帮助: -h - 打印基本选项 -h long - 打印更多选项 -h full - 打印所有选项(包括所有格式和编解码器特定选项,非常长) -h type = name - ...

程序手艺人 - 嵌入式音频技术之旅 7008

VLC播放器创建rtsp直播流、拉流操作,实现url在网页播放

VLC播放器作为服务器推流

moneyxjj的博客 8134

javacv和FFmpeg实现视频播放器的制作,和视音同步操作;

最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放。采用的同步方法是视频向音频同步。具体的思路如下:(1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的[java] view plain copyFFmpegFrameGrabber fg = new FFmpegFrameGrabber("a video file path...

hongfei568718926的博客 3692

基于ffmpeg实现监控录屏,抓拍Java工具类

【代码】基于ffmpeg实现监控录屏,抓拍Java工具类。

weixin_52443523的博客 1455

Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图

【代码】Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图。

qq_42623400的博客 2488
上一篇: JavaCV 入门
下一篇: android ijkplayer 中遇到的问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值