Android 播放SMB共享视频

devtools/2025/1/18 1:56:25/

表面上看MediaPlayer只能播放本地和http协议视频。没有直接支持smb://协议。那还能播放smb视频呢?也可以的!

MediaPlayer有一个方法叫:setDataSource(MediaDataSource)。

    /*** Sets the data source (MediaDataSource) to use.** @param dataSource the MediaDataSource for the media you want to play* @throws IllegalStateException if it is called in an invalid state* @throws IllegalArgumentException if dataSource is not a valid MediaDataSource*/public void setDataSource(MediaDataSource dataSource)throws IllegalArgumentException, IllegalStateException {_setDataSource(dataSource);}

我们只要实现MediaDataSource这个接口就可以了。

/*** For supplying media data to the framework. Implement this if your app has* special requirements for the way media data is obtained.** <p class="note">Methods of this interface may be called on multiple different* threads. There will be a thread synchronization point between each call to ensure that* modifications to the state of your MediaDataSource are visible to future calls. This means* you don't need to do your own synchronization unless you're modifying the* MediaDataSource from another thread while it's being used by the framework.</p>*/
public abstract class MediaDataSource implements Closeable {/*** Called to request data from the given position.** Implementations should fill {@code buffer} with up to {@code size}* bytes of data, and return the number of valid bytes in the buffer.** Return {@code 0} if size is zero (thus no bytes are read).** Return {@code -1} to indicate that end of stream is reached.** @param position the position in the data source to read from.* @param buffer the buffer to read the data into.* @param offset the offset within buffer to read the data into.* @param size the number of bytes to read.* @throws IOException on fatal errors.* @return the number of bytes read, or -1 if end of stream is reached.*/public abstract int readAt(long position, byte[] buffer, int offset, int size)throws IOException;/*** Called to get the size of the data source.** @throws IOException on fatal errors* @return the size of data source in bytes, or -1 if the size is unknown.*/public abstract long getSize() throws IOException;
}

下面是我实现的代码:

public class CustomMediaDataSource extends MediaDataSource {private static Logger Log4j = Logger.getLogger(CustomMediaDataSource.class);private SmbRandomAccessFile mFile; // must not Main UI thread.private long mFileSize;public CustomMediaDataSource(SmbRandomAccessFile smbFile, long size) throws SmbException {this.mFile = smbFile;mFileSize = size;}@Overridepublic int readAt(long position, byte[] buffer, int offset, int size) throws IOException {if (mFile.getFilePointer() != position)mFile.seek(position);if (size <= 0)return 0;Log4j.info("CustomMediaDataSource, readAt, position:" + position);return mFile.read(buffer, 0, size);}@Overridepublic long getSize() throws IOException {return mFileSize;}@Overridepublic void close() throws IOException {mFileSize = 0;if (mFile != null) {mFile.close();mFile = null;}}
}

这里有一个小插曲, 导致花费了大半天时间。视频播放不能用InputStream接口,要用RandomAccess接口。因为视频播放的数据不是按顺序取的。不然就会报错:java.io.IOException: Prepare failed.: status=0x1。

如果你是其他播放器的, 同样也会有这样的接口提供给你。比如ljkPlayer等。

这个主题值得写一下,网上基本没有讲到。


http://www.ppmy.cn/devtools/151429.html

相关文章

Vue3 Element-Plus el-tree 右键菜单组件

参考代码&#xff1a;实现Vue3Element-Plus(tree、table)右键菜单组件 这篇文章的代码确实能用&#xff0c;但是存在错误&#xff0c;修正后的代码&#xff1a; <template><div style"text-align: right"><el-icon size"12" color"#…

网络学习记录5

二、学习网络知识&#xff1a; 1、透传&#xff1a; ①“透传”指的是数据在传输过程中不被交换机或其他网络设备解析、修改或处理&#xff0c;而是直接从一个端口传输到另一个端口。这种传输方式保持了数据的原始性和完整性&#xff0c;常用于需要高速、低延迟的数据传输场景…

golang 在线词典

前言 输入一个英语单词&#xff0c;返回它的发音&#xff0c;解释&#xff0c;同义词&#xff0c;反义词&#xff0c;以及例子 使用的是免费翻译网站&#xff0c;彩云小译 注意&#xff0c;彩云小译更新&#xff0c;博主并没有找到dict响应&#xff0c;但是写这个却能调用 步骤…

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…

RabbitMQ-消息消费确认

我们一般使用的是消费者作为被动方接收 RabbitMQ 推送消息&#xff0c;另一种是消费者作为主动方可以主动拉取消息。 RabbitMq 服务器推送消息分为隐式(自动)确认和显示确认。 1 消费者拉取消息 消费者作为主动方拉取消息&#xff0c;每次只能获取一条。 using (var channel c…

如何在uniapp中实现一个表格组件?

功能介绍&#xff1a; 1 表格头自定义列。 2 表格头支持勾选功能&#xff0c;并且支持配置。通过配置显示或隐藏该功能 3 支持自定义样式和自定义操作。比如修改列数据内容样式&#xff0c;上图中年龄做了自定义的处理&#xff0c;点击某列内容可以自定义操作。 ----------…

vue2配置跨域后请求的是本机

这个我来说明一下&#xff0c;因为我们公司的后端设置解决了跨域问题&#xff0c;所以我有很久没有看相关的内容了&#xff0c;然后昨天请求了需要跨域的接口&#xff0c;请求半天一直不对&#xff0c;浏览器显示的是本机地址&#xff0c;我以为是自己配置错了&#xff0c;后面…

HTTP 安全:HTTPS 原理与配置

一、引言 在当今数字化时代&#xff0c;网络安全至关重要。我们日常上网离不开 HTTP 协议&#xff0c;但它存在安全隐患。HTTP 以明文传输数据&#xff0c;信息易被窃取、篡改&#xff0c;身份也难以验证&#xff0c;像账号密码、交易信息等敏感内容在传输时毫无保障。 为解决…