接入B站iframe视频(bilibili引用视频)

前言

因为公司要搞一些视频给客户看, 然后对比了各种视频网站, 各种广告什么的, 体验都不好.
选来选去, 还是B站(BiliBili)好, 而且自己又是B站大会员用户 ( 其实在我心里早就内定了 ✧(≖ ◡ ≖) )

这里总结一下碰到的一些坑吧

B站链接参数

https://player.bilibili.com/player.html?aid=699690540&bvid=BV1Zm4y1e7eR&cid=1159067867&p=1&as_wide=1&high_quality=1&danmaku=0&t=30

key说明
cidchat id,每个chat id对应一组弹幕池和
如填了 aid, 这个字段不填也没关系
aidarticle id, 视频的av号
就是B站的 avxxxx 后面的数字
bvidbilibili video id, 视频的bv号
2020.03 时候, B站把 AV 号根据一定的算法转成这个了
如果填了 bvid, 那么 aid 不填也可以
page(或者p)第几个视频, 起始下标为 1 (默认值也是为1)
就是B站视频, 选集里的, 第几个视频
as_wide是否宽屏
1: 宽屏, 0: 小屏
high_quality是否高清
1: 高清, 0: 最低视频质量(默认)
如视频有 360p 720p 1080p 三种, 默认或者 high_quality=0 是最低 360p
high_quality=1 是最高1080p
danmaku是否开启弹幕
1: 开启(默认), 0: 关闭
t打开时, 自动跳转到某个时间, 并且自动播放(单位秒)
比如 t=60, 那么自动跳转到1分钟, 且自动播放

已解决的坑

按比例播放视频

按比例播放视频

<!DOCTYPE HTML>
<html>
    
    <head>

    <style type="text/css">
        .aspect-ratio {
            position: relative;
            width: 100%;
            height: 0;
            padding-bottom: 75%;
        }
    
    .aspect-ratio iframe {
        position: absolute;
        width: 100%;
        height: 100%;
        left: 0;
        top: 0;
    }
    </style>
    
        
    </head>
    
    <body>
        
        <h1> test </h1>
        
        <div class="aspect-ratio" >
            <iframe src="https://player.bilibili.com/player.html?aid=56850347&cid=99299213&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
        </div>
        
    </body>
</html>

阻止跳转到B站

在网页上, 用户选择清晰度, 或者点击视频上面的一些图标, 会跳转到B站. 这个可通过设置 iframe 的 sandbox 属性去禁止
sandbox=“allow-top-navigation allow-same-origin allow-forms allow-scripts”

<iframe src="https://player.bilibili.com/player.html?cid=99269782&aid=56824180&page=1&as_wide=1&high_quality=1&danmaku=0"
			 allowfullscreen="allowfullscreen" width="100%" height="500" scrolling="no" frameborder="0" sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts"></iframe>

注意, 如果单单设置了 sandbox , 却没有传参 high_quality 字段为 1, 那么用户是切换不了视频质量的.
就是用户只能在 360p, 而点击了 720p 或者 1080p 都无效

解决iOS上自动跳转到B站APP (Universal Links)

因为需求, 还要可能访问到B站, 但是又不想跳出, 这又牵扯到 Universal Links 的问题 ( 自动跳转是因为 Universal Links ).

虽然系统没有公开给我们选项, 但通过直接强加就可以了 (下面是 WKWebView 的代理 WKNavigationDelegate 方法)

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    decisionHandler(WKNavigationActionPolicyAllow);
}
//当前设备系统版本号
#define SYSTEMVersion [[[UIDevice currentDevice] systemVersion] floatValue]
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if(SYSTEMVersion < 9.0f) {
        // iOS 9 还没有
        decisionHandler(WKNavigationActionPolicyAllow);
    }else{
        // 返回+2的枚举值, 意思允许链接跳转, 但是类似这种 Universal Links, 就不会去瞎跳到什么APP
        decisionHandler(WKNavigationActionPolicyAllow + 2);
    }
}

iOS 播放自动放大问题

这个是 webView 默认配置问题, 改一下默认配置就好

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
// 允许不全屏播放
configuration.allowsInlineMediaPlayback = YES;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];

不过允许不全屏…那也跟着有另一个问题了, 就是如何把它放大???
主要目前又没解决监听他的放大按钮问题, 那这样的话, 就无法放大了…

弹幕因为 http 请求无法播放问题

报警告,http 请求问题

Mixed Content: The page at '<URL>' was loaded over HTTPS, but requested an insecure

在 head 里面加入

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />

待填的坑

  1. 如何监听 iframe 里面的事件这些
  2. 如何隐藏 iframe 里面某些元素

一些其他事项

  1. 默认 480p,是未登录问题
  2. 没有播放的控制条,可以尝试改变一下视频大小

各位参考(大佬)网站

按比例播放视频

视频清晰度问题(评论里面找的)

解决自动跳转到B站APP

有帮到您的,就赞一个吧,编写不易!

B站缓存视频的名字代码,也就是Bilibili视频缓存的命名方式。首先,我们需要了解B站缓存视频的命名规则。B站的缓存视频文件名由一串数字和字母组成,通常是一个32位的MD5值,用于保证文件名的唯一性和安全性。这个MD5值是根据视频内容计算生成的,不同的视频内容对应不同的MD5值。 当我们从B站观看视频时,如果选择了缓存功能,系统会自动视频进行缓存,并将缓存文件保存在相应的文件夹中。而缓存文件的名字就是通过MD5值生成的。 关于具体的代码实现,我们可以利用B站提供的API来获取视频的缓存信息,并获取到缓存视频的文件名代码。下面是一个简单的示例代码: ```python import hashlib # 获得视频内容计算生成的MD5值 def get_md5(content): md5 = hashlib.md5() md5.update(content.encode('utf-8')) return md5.hexdigest() # 获取缓存视频的文件名 def get_cache_filename(video_url): # 从B站API获取视频内容 video_content = get_video_content(video_url) # 计算MD5值 md5_value = get_md5(video_content) # 生成缓存视频的文件名 cache_filename = md5_value + '.mp4' return cache_filename # 调用示例 video_url = 'https://www.bilibili.com/video/xxx' cache_filename = get_cache_filename(video_url) print(cache_filename) ``` 当我们调用`get_cache_filename`函数时,将视频的URL作为参数传入,即可获取到对应的缓存视频文件名。这样,我们就可以根据缓存视频的文件名来索引和管理缓存视频文件了。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值