最近在做音视频相关的内容,这就无法避开视屏采集和播放的问题了,然后播放器使用的是 ijkplayer,这个东西使用 url 播放倒是没啥问题,只是我们的方案是接收 flv 的视频流进行播放,这需要借助 IAndroidIO 这个接口,也可以用于播放本地文件。

实现 IAndroidIO 接口

播放类的实现

class ReadByteIO private constructor(): IAndroidIO {companion object {private var instance: ReadByteIO? = nullvar URL_SUFFIX = "recv_data_online"@Synchronizedfun getInstance(): ReadByteIO { // 单例instance?.let {return it}instance = ReadByteIO()return instance!!}}private var TAG = ReadByteIO::class.java.simpleNameprivate var flvData = LinkedBlockingDeque<Byte>()  // 内存队列,用于缓存获取到的流数据,要实现追帧效果,只需要根据策略丢弃本地缓存的内容即可private fun takeFirstWithLen(len : Int): ByteArray {  // 取 byte 数据用于界面渲染var byteList = ByteArray(len)for (i in 0 until len) {byteList[i] = flvData.take()}return byteList}@Synchronizedfun addLast(bytes: ByteArray): Boolean { // 新收到的数据通过该接口,添加到缓存队列的队尾var tmpList:List<Byte> = bytes.toList()Log.e(TAG, "tmpList size " + tmpList.size)return flvData.addAll(tmpList)}// 如果是播放本地文件,可在此处打开文件流,后续读取文件流即可override fun open(url: String?): Int {if (url == URL_SUFFIX) {return 1 // 打开播放流成功        }return -1 // 打开播放流失败}override fun read(buffer: ByteArray?, size: Int): Int {var tmpBytes = takeFirstWithLen(size) // 阻塞式读取,没有数据不渲染画面System.arraycopy(tmpBytes, 0, buffer, 0, size)return size}override fun seek(offset: Long, whence: Int): Long {return 0}override fun close(): Int {return 0}
}

调用播放类

接下来,就看看如何调用播放实例了。注意:我们还是需要传入一个 url,只是这个 url 是我们自定义的

public class RecordVideoActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {private String TAG = RecordVideoActivity.class.getSimpleName();private IjkMediaPlayer player;private Surface surface;private TextureView playView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_record_video);playView = findViewById(R.id.v_play);playView.setSurfaceTextureListener(this);}@Overrideprotected void onDestroy() {super.onDestroy();if (player != null) {player.stop();}}@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {if (surface != null) {this.surface = new Surface(surface);play();  // 存在 surface 实例再做播放}}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { }@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {return false; }@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) { }private void play() {player = new IjkMediaPlayer();player.reset();player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100);player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 25 * 1024);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1);player.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "threads", 1);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "sync-av-start", 0);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec",1);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "ijkio,crypto,file,http,https,tcp,tls,udp"); // 属性设置支持,转入我们自定义的播放类player.setSurface(this.surface);player.setAndroidIOCallback(ReadByteIO.Companion.getInstance());Uri uri = Uri.parse("ijkio:androidio:" + ReadByteIO.Companion.getURL_SUFFIX()); // 设定我们自定义的 urltry {player.setDataSource(uri.toString());} catch (IOException e) {e.printStackTrace();}player.prepareAsync();player.start();}
}

android 使用 IJKPlayer 播放视频流相关推荐

  1. android udp rtp播放器,IjkPlayer For Android(3)-RTP直播硬解码支持

    IjkPlayer播放器其实是支持RTP直播的,但是只能用ffmpeg软解码不能使用硬解码. 这里将会从以下几个方面配置使用 1.UDP RTP/RTMP区别 2.FFMpeg推流 3.IjkPlay ...

  2. 智能android电视更换播放器,GitHub - qfwc258/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...

    TvPlayer 1,android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现 2,测试的源地址可能失效,如需测试可以自己更换播放源.HttpUtils.getOfflin ...

  3. Android ijkplayer播放rtsp直播流

    因为Android ijkplayer播放rtsp直播流在加载时延迟在5-10秒实在难以接受,再修改后解决了延迟问题,目前已达到2秒甚至秒开的效果 添加的方法:VideoOptionModel vid ...

  4. 智能android电视更换播放器,GitHub - kaigeLove/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...

    TvPlayer 1,android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现 2,测试的源地址可能失效,如需测试可以自己更换播放源.HttpUtils.getOfflin ...

  5. 智能android电视更换播放器,GitHub - xioxu/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...

    TvPlayer 1,android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现 2,测试的源地址可能失效,如需测试可以自己更换播放源.HttpUtils.getOfflin ...

  6. android 基于ijkplayer项目进行的播放器

    jjdxm_ijkplayer 项目地址:jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. 是 ...

  7. android无法播放视频文件格式,基于Android引入IjkPlayer无法播放mkv格式视频的解决方法...

    写在前面 项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,默认是不支持mkv和rmvb格式视频的播放的. 用了一天时 ...

  8. ijkplayer在Android 12不能播放,闪退

    在Android 12上播放音频时无法播放,总是闪退,看日志找原因也不是特别明显. 后来经过多次测试,发现每次闪退总会打印以下日志: Fatal signal 7 (SIGBUS), code 1 ( ...

  9. 使用IJKPlayer播放视频实现了一些播放视频的基本操作

    使用IJKPlayer播放视频实现了一些播放视频的基本操作 Iijkplayer目前是很流行的音视频框架,集成我这里就不多说了,网上很多,大概就是编译ijkplayer的源码得到里边的so文件,添加到 ...

最新文章

  1. FPGA之道(20)FPGA设计的上板调试与项目总结
  2. CV之detectron2:detectron2安装过程记录
  3. 生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络
  4. 嵌入式操作系统内核原理和开发(固定内存分配算法)
  5. 表头样式_1分钟学会制作Word两栏、三栏表头
  6. 求合作开发伙伴 .NET 中高级工程师 1-2名
  7. MongoDB简单CRUD场景
  8. QTP Flex测试
  9. c#.net全站防止SQL注入类的代码
  10. 异步赠书:10月Python畅销书升级
  11. php工具下载 脚本之家,php脚本编辑工具题目
  12. 台式机连接蓝牙音响没声音 以及 声音延迟 问题解决
  13. 小程序12306服务器,微信小程序12306来了!史上最详细体验出炉!
  14. win10系统停止更新服务器,Win10系统关闭自动更新功能的三种最佳方法
  15. 提交.a文件到svn
  16. SDN实验(六)——SDN流量监控
  17. 深圳神牛python培训_请教神牛_字符串hash
  18. 微信云托管-填坑之旅
  19. matlab diff函数
  20. sql 三个表联合查询(三表左联查询)

热门文章

  1. Docker容器原理详解
  2. “生活”才是生活的一部分
  3. Nexon Launcher 已安装游戏位置变更
  4. 微信小程序引入VantWeapp开发
  5. 扬帆凌远:2022年单干可以选择SHOPEE吗?
  6. 英睿达硬盘测试软件,【英睿达 MX300 750GB SATA3 固态硬盘外观测试】软件|界面|容量|传输_摘要频道_什么值得买...
  7. PowerMock代码
  8. 面试常见海量数据场景题
  9. css 锥形渐变实现仪表盘
  10. 使用URLRequest获取MP3并进行播放的例子 .