全部产品
云市场

客户端常见问题

更新时间:2019-06-27 14:18:57

常见问题汇总

1. 如何实现列表预加载

  • 在视频列表中添加多个播放器实例。
  • 在播放当前视频时,同时prepare上一(几)个和下(几)个视频资源。
  • 这时视频资源也会在就近的节点预热,下次加载视频时会更快。
  • 在切换的新视频时直接调用播放器的start接口。

2. ios如何播放手机中的视频?

对于ios程序来说,有一个沙盒的限制,应用程序不能够访问沙盒之外的文件,但是可以通过变通的方式来做,具体可以查询相关资料。

  1. 1.先获取沙盒中Documents的路径。
  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  3. NSString *documentsDirectory = [paths objectAtIndex:0];
  4. 2.假设存储在Documents中的文件名为test.mp4,得到视频文件的绝对路径。
  5. NSString *fullPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"test.mp4"];

3. ios添加framework,运行crash?

Framework是动态库,开发者打开工程,选中目标target,依次选择”General”->”Embededed Binaries”,点击”+”号,点击“Add Other…”,导入对应的Framework动态库。

4. Android播放时想切换到下一个播放,怎么操作?

需要将上一个播放器release掉,然后需要重新创建一个播放器实例来进行打开操作。参考demo中NoSkinActivity里replay函数:

  1. 1.先停止上一个视频播放。
  2. if (aliyunVodPlayer != null) {
  3. aliyunVodPlayer.stop();
  4. }
  5. 2.更新playauth鉴权信息(如果不用鉴权,可省略这个步骤)。
  6. aliyunVodPlayer.setAuthInfo(aliyunPlayAuth);
  7. 3. 建议刷新surfaceHolder
  8. if (surfaceView != null) {
  9. surfaceView.setVisibility(View.GONE);
  10. surfaceView.setVisibility(View.VISIBLE);
  11. }
  12. 4. 准备开启播放
  13. aliyunVodPlayer.prepareAsync();

5. 点播播放器SDK打开速度较慢,黑屏如何处理?

无皮肤的接口:提供了一个首帧显示的通知setOnFirstFrameStartListener,为了能够更好的体验,可以打开的时候显示一个等待画面,收到首帧显示的通知取消显示等待画面.有皮肤的接口:提供了一个设置封面的接口setCoverResource,在setOnPreparedListener回调未完成之前显示封面画面.

6. IOS:CFBundleExecutable 问题

  1. ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/xxx.app/AliyunLanguageSource.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."

解决方案:删除AliyunLanguageSource.bundle下,info.plist文件中的CFBundleExecutable(Executable file -> AliyunLanguageSource)键值对。

投屏问题

1. 阿里云播放器支持投屏吗?

目前SDK不支持投屏。需要客户自己接入第三方投屏库。

2. 投屏阿里云地址的注意点?

接入第三方库之后,只有不加密的阿里云url是可以实现投屏的。因为阿里云的url的视频内容是加密的,其他的播放器不支持阿里云加密视频的播放。

如何获取转码后不加密的地址,请到官网上查找对应的文档:https://help.aliyun.com/document_detail/57292.html?spm=a2c4g.11186623.6.655.3403507akudWo0或者询问服务端相关开发人员。

CPU架构兼容问题

1.CPU架构兼容列表。

Developer官方文档中关于Android 平台 ABI 支持(需翻墙)的兼容性有很明确的说明:

为实现最佳性能,应直接针对主要 ABI 进行编译。例如,基于 ARMv5TE 的典型设备只会定义主要 ABI:armeabi。 相反,基于 ARMv7 的典型设备将主要 ABI 定义为 armeabi-v7a,而将辅助 ABI 定义为 armeabi,因为它可以运行为每个 ABI 生成的应用原生二进制文件。

许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。

也就是说: armeabi-v7a是兼容armeabi的。x86是兼容armeabi-v7a的。

2.举例:

Aliyun播放器目前支持的CPU架构有两个:armeabi-v7a,arm64-v8a.

1. 其他库与阿里云CPU架构没有交集。

比如其他库只有armeabi的架构。这种情况,根据上面的兼容性说明,可以知道:armeabi-v7a是兼容armeabi的。所以可以把armeabi的库拷贝到armeabi-v7a的库中。解决后架构如下:

单独ABI

2. 其他库与阿里云播放器ABI有交集。

比如其他库有armeabi-v7a , x86_64.这种情况,两者的交集就是armeabi-v7a. 那么只要保留两者的交集就行了。解决后架构如下:

交集ABI

仿抖音相关问题

1.视频不能铺满画面,黑边的问题。

现在很多仿抖音的软件,在使用播放器的时候,发现SurfaceView(TextureView)已经全屏了,但是画面还不是全屏的,两边有黑边。

这种情况,播放器提供了setVideoScalingMode方法提供去改变画面的大小。

VIDEO_SCALING_MODE_SCALE_TO_FIT:按照视频的宽高比,放到SurfaceView(TextureView)中。不会剪裁视频画面,画面的内容是完整的。比如我的SurfaceView是1920:1080的,然后播放一个1280x720的视频,如果使用FIT模式,最终显示的话,播放器把1280x720这个视频按照原始比例放大,直到宽或者高跟SurfaceView的宽或者高一直,最终只有上下有黑边或者左右有黑边。VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING :按照视频的宽高比,将画面铺满SurfaceView(TextureView)中。此时会剪裁视频的画面,可能两边有部分内容不会被显示。crop方式肯定是没有黑边的。

具体效果如下图:左边是FIT模式,右边是CROP模式。红色矩形是Surface大小。

mode对比

在本例中:由于视频宽高与Surface比例不一致,FIT模式会有上下两块没有图像(也就是黑边)。CROP模式则左右两边的画面超出Surface大小,不会显示出来。

2.切换视频时,等待时间较长,怎么处理?

目前播放器主要是在prepare的时候要耗时。所以为了视频看起来更快,可以创建多个播放器去解决这个问题。提前prepare好下一个视频,那么切换到下一个视频的时候,直接start就能播放。大大提高了加载速度。

这里为了避免创建过多的播放器影响APP的响应,建议采用池化技术,也就是考虑播放器重复使用,避免过多的创建播放器。

3.切换下一个视频时,有上个画面的残留,怎么处理?

切换下一个视频的时候,需要调用stop(),然后调用reset()方法,然后再prepare下一个视频的url。

同时,如果重用TextureView或者SurfaceView的话,需要刷新一下view,然后重新绑定到播放器中。

4.播放器先有声音再有画面,音画不同步是什么原因?怎么解决?

先有声音再有画面有多种情况导致:

情况1. 视频源本身就是先有声音然后有画面。这种情况可以用其他播放器对比测试看看。如果多个播放器都有一样的现象,基本上可以确定是流本身的问题了。这种情况的处理办法就是重新转码,保证音视频同时出来。

情况2. 视频的分辨率较高。比如2K及以上分辨率。由于Android是软解码,过高的分辨率会导致解码消耗很多CPU,CPU发热,从而引发CPU降频,导致解码速度变慢,最终引起视频的解码速度跟不上,引发不同步。 这种情况,建议播放的分辨率不要过大。

iOS是硬解码,应该不会出现这样的问题。

播放失败的情况怎么处理?怎么定位?

1. 服务器相关的报错:比如:请求服务器失败等。

排查步骤:

  1. 打开播放器的日志:调用player.enableNativeLog() 即可打开。
  2. 手机连上logcat。 命令行运行adb logcat > problem.log.txt(不清楚的请自行到网络上查找) 复现出错情况.
  3. 过滤txt文件中的response ,查看对应的输出。一般出错,就会有ResponseStr在返回中。里面的信息就是出错的信息。
  4. 拿着这个信息,找到后台服务的开发同学,询问出错原因。


2.无效的视频地址。一般是prepare的时候出现。或者播放过程中的出错。

首先,播放器只支持h264+aac的mp4,flv,hls播放,mp3的播放.其他格式不支持。如果超过这几个格式,播放器是不支持的。
接下来排查步骤:

  1. 确认app是否添加了权限:本地视频需要sd卡权限,网络视频需要internet权限。
  2. 到官网的demo上,试试会不会出现同样的问题。如果官网没有出现,请自行查看代码流程。
  3. 打开播放器的日志:调用player.enableNativeLog() 即可打开。
  4. 手机连上logcat。 命令行运行adb logcat > problem.log.txt(不清楚的请自行到网络上查找) 复现出错情况.
  5. 将日志文件problem.log.txt文件发送给阿里云开发人员,交给他分析。

3.播放崩溃。

排查方法与【2.无效的视频地址】同样。

其他问题

1.播放器支持TextureView吗?

播放器支持SurfaceView以及TextureView.建议在列表中,使用TextureView来避免画面的残留问题。

2.播放器如何集成到工程中?

集成方法的文档在官网上有,地址在这里:https://help.aliyun.com/document_detail/61908.html?spm=a2c4g.11186623.6.777.6ffb61b0ppvnyr。包括混淆的配置也是在这个文档中有说明。

另外特别说明一下:如果只想使用基础播放器,只需要集成AlivcPlayer 与 report 这两个库。

如果使用高级播放器,则AlivcPlayer,report与AliVodPlayer三个库都是需要集成进去的。

3.4.7版本及以后的版本,基础播放器和高级播放器都需要增加对OSS的支持。具体做法是在gradle中增加依赖:compile 'com.aliyun.dpa:oss-android-sdk:+'

3.服务端转码多个清晰度,播放时的清晰度是怎么处理的?

视频在服务端转码多个视频之后,播放器播放时,会选择其中一个清晰度进行播放。选择逻辑如下:1.用户未指定播放清晰度,将会播放最高的清晰度。2.用户通过播放源(AliyunVidSts,AliyunVidAuth等)调用setQuality方法设置清晰度之后,播放时,将会播放设置的清晰度。如果没有转码对应的清晰度,那么就会播放与之最近的清晰度。清晰度的分辨率大小顺序为:FD流畅<LD低清<SD标清<HD高清<2K<4K<OD原画.举例如下:服务端转码清晰度为LD,HD,2K。用户设置清晰度为HD。此时将会播放HD的清晰度。用户设置清晰度为SD。此时将会播放LD的清晰度。

下载相关的问题

1.下载支持断点下载吗?

是支持的。下载完之后是一个mp4文件。

2.视频下载之后是否是加密的?

下载之后是否是加密的,是根据控制台的下载类型判断的。

如果控制台配置的是安全下载,那么下载下来的视频就是加密的,只能用阿里云播放器能够播放。

如果配置的是普通下载,那么下载下来的就是不加密的,其他播放器都是能够播放的。

3.加密播放提示“invalid secret image” 是怎么回事?

这个提示是由于播放器校验加密文件不通过导致的。确认一下:

  1. 是不是加密文件没有正确设置?
  2. 加密文件是不是和app的签名不一致?

4.下载过程到90%速度慢下来了,是怎么回事?

针对HLS下载的过程是这样的:前5%,下载m3u8文本文件。5%~90% 下载实际的数据。90%~100%,转封装。对mp4则直接到90%,然后再本地加密或者不加密。

5.下载出错之后应该怎么操作才能继续下载?

当下载的错误回调之后,如果想继续下载,则需要先stop,remove。然后再prepare等操作。如果不remove,则会出现重新下载不了的情况。

边播边缓存的问题

1.缓存下来的文件是加密的还是不加密的?

缓存下来的视频是否加密,是由视频源决定的。如果视频源是加密的,那么缓存下来也是加密的。如果源不是加密的,那么缓存下来的也不是加密的。

2. 什么情况下会缓存?什么时候使用缓存?

1.视频的信息(大小,时长等)没有超过setPlayingCache的参数的时候会缓存。2.播放过程中如果seek过了,那就不会缓存。3.缓存的使用是播放器自动使用的。比如循环播放的时候,比如下次播放同一个视频的时候。

播放画面问题

1.部分视频画面被拉伸了,是什么原因?

播放器是严格按照视频的宽高比显示的。如果画面被拉伸了,对比一下原画与转码后的视频分辨率。如果两者分辨率不成统一的比例,那就是转码的问题了,请教一下转码的同学即可。

2.播放发现音视频不同步,怎么处理?

安卓是软解。

  1. 用VLC等播放器播放一下是否同步。不同步则是视频源的问题。return;
  2. 设备的CPU是否主频比较低(1.5hz以下)?或者发热严重降频了?
  3. 视频的分辨率是否过高?大于1080P?如果过高,会导致软解码跟不上,引发音频不同步。