看不了电视直播了?那就自己做一个(二)

由于最近直播软件都用不了了,所以自己瞎折腾做了一个。

在上一篇文章中,已经介绍了客户端播放器部分。

看不了电视直播了?那就自己做一个(一)

但是对于播放源获取只是介绍了接口,并没有说明它的实现

java 复制代码
public abstract class ChannelServiceAbstract implements ChannelService{
    private  List<Channel> channels;
    private  Map<Integer, Channel> channelMap;
    private  int currentChannel = 0;
    
    public void loadChannels(LoadCallBack callBack) {
        public void loadChannels(LoadCallBack call){
            new Thread(() -> {
                channels =doLoadChannels();
                channelMap =new HashMap<>();
                for (Channel channel : channels) {
                    channelMap.put(channel.getId(),channel.getSource());
                }
                call.onLoaded(true,null);
            }).start();
        }
    }
    
    protected abstract void doLoadChannels();
    
    @Override
    public Channel getDefaultChannel(){
        return getChannel(currentChannel);
    }

    @Override
    public Channel getNextChannel(){
        return getChannel(++currentChannel);
    }

    @Override
    public Channel getPrevChannel(){
        return getChannel(--currentChannel);
    }
    
    @Override
    public Channel getChannelById(int id){
        Channel channel=channelMap.get(id);
        if(channel!=null){
          currentChannel=channelList.indexOf(channel);
        }
        return channel;
    }

    private Channel getChannel(int index){
        if (index >= channelList.size()) {
            currentChannel = 0;
        }
        return channelList.get(currentChannel);
    }
}

如果是以前的话,这里直接采用从m3u文件读取的实现就可以了。

java 复制代码
public class M3uChannelService extends ChannelServiceAbstract {
    static final String M3U_URL="";
    public void doLoadChannels() {
        String text = HttpUtil.getForText(M3U_URL, null);
        List<Channel> channels = M3uParser.parseText(text);
        return channels ;
    }
}

但是目前来说,公开的能用的m3u文件几乎是没有了,偶尔流出一些也很快会失效,想要有稳定的源最好的方法还是自己生成,因此,为了兼顾不同的实现,我把它定义成了接口。

在继续之前,我先介绍下整体的架构,如下图。

首先最底层负责定时采集以及更新视频源,采集到视频源数据后,接下来有两种处理方式

1.生成m3u文件

第一种方式是将视频源数据生成为m3u文件,然后上传至文件服务,比如github(其他客户端可以访问的都可以)。客户端通过从文件服务读取m3u文件并解析播放。

这种方式的好处是只需要负责采集视频源生成文件并上传就可以了,无需再额外搭建服务。

2.存储至数据库

另外一种方式是将采集到的视频源存入数据库,并通过一个视频管理服务对外提供http接口供客户端获取播放源。

这种方式的好处一方面是可以进行鉴权防止未经授权的访问,另外一方面就是可以提供除获取视频源以外的管理接口,比如当发现某个视频源无效时可以触发服务器重新采集新的视频源。

第一种方式比较简单,这里说明下第二种方式,因为此前有个线上的java项目,所以偷懒就在上面直接加了几个接口,实际并不限定使用java,其他语言也是一样的。

java使用springboot创建服务,几行代码就可以了,稍微了解下就能做到,或者可以也使用ChatGpt完全代劳。

pom.xml

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

下面是查询所有播放源的接口实现。

java 复制代码
@RestController
public class ChannelController {

    @Autowired
    ChannelMapper channelMapper;

    @GetMapping(path = "/list")
    public List<Channel> list() {
        ChannelExample example = new ChannelExample();
        example.createCriteria().andStatusEqualTo(Status.VALID.getCode());
        return channelMapper.selectByExample(example);;
    }
}

最后不要忘了,安卓客户端需要有一个通过Http接口获取视频源的ChannelService

java 复制代码
public class HttpChannelService extends ChannelServiceAbstract {
    static final String SERVER_URL="";
    public void doLoadChannels() {
        List<Channel> channels= HttpUtil.getForList(SERVER_URL, Channel.class);
        return channels;
    }
}

当然,你也可以通过拦截所有请求做前置校验鉴权,也可以对返回报文做统一封装,以及最基本的全局异常的处理,但这些不在本次的讨论范围,而且即使对于个人使用来说可以完全不用这些。

到现在为止客户端和服务端的实现已经讲完了,由于视频源采集部分较为繁琐,下一篇再继续讲解。

相关推荐
Nyarlathotep01134 分钟前
并行设计模式(3):Future模式
java·后端
流星雨在线7 分钟前
汇总:Tomcat 安装与常用配置
java·tomcat
小冷coding30 分钟前
【面试】结合项目整理的场景面试题,覆盖 Java 基础、锁、多线程、数据库、分布式锁 / 事务、消息中间件等核心维度
java·数据库·面试
鬼先生_sir30 分钟前
SpringCloud-GateWay网关
java·spring cloud·gateway
卓怡学长43 分钟前
m319个人网站的设计与实现
java·数据库·spring·tomcat·maven·intellij-idea
Zzj_tju1 小时前
Java 从入门到精通(十二):File 与 IO 流基础,为什么程序“读写文件”时总是容易出问题?
java·python·php
橘子编程2 小时前
操作系统原理:从入门到精通全解析
java·linux·开发语言·windows·计算机网络·面试
飞Link2 小时前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
xuhaoyu_cpp_java2 小时前
Boyer-Moore 投票算法
java·经验分享·笔记·学习·算法
JavaEdge.2 小时前
Chrome加载已解压的扩展程序-清单文件缺失或不可读取 无法加载清单
java