Android ijkplayer视频播放 有声音没画面或者很卡(不同的视频源,原因也不同,我只记录一下我们项目遇到的)

  • Post author:
  • Post category:其他

前两天周末的时候,开发群里,有领导反应有一个视频,安卓手机只有声音,没有画面,领导让我找一下原因,首先我肯定要看一下这个视频本身是不是有问题的,我下载下来后,是可以正常播放的,而且h5和ios都可以正常播放,只有我们安卓的手机播放的时候只有声音没有画面,然后猜测是我们安卓的播放器的问题,可能是我们的播放器不支持这种视频格式,然后把下载下来的视频,使用ffmpeg命令ffprobe -i /Users/guo/Downloads/o_1d1nugr55kn8136m1e4juok4gk8.mp4查看了视频源的信息,发现是mpeg4协议的视频,然后我拿正常的可以播放的视频下载下来后,使用命令查看视频信息,发现是h264协议的视频,很明显了,是我们的播放器播放mpeg4协议的视频有问题,但是我们用的是ijkplayer,为什么不支持这种协议的,不是说ijkplayer只是的视频格式很多吗。

接着就是去ijkplayer的github的issues上查找原因,原来ijkplayer默认的so是不支持mpeg4的视频的,在我们这里,mpeg4是视频原片,h264是转码后的视频,我们是使用别人家的第三方直播平台,通过他们平台的转码拿到h264的视频的,也就是说这个有问题的视频是转码失败的视频,也就是视频原片,既然第三方平台转码不了,只能我们客户端做处理了,先看一下ijkplayer使用的so

dependencies {
    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'

    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'

    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
}

这是默认的so,在gradle中添加依赖就可以了,但是如果想要你的ijkplayer支持更多协议的视频,需要你自己去编译打so,怎么去打支持更多协议的so,github上都已经给出了方法:

If you prefer more codec/format
cd config
rm module.sh
ln -s module-default.sh module.sh
cd android/contrib
If you prefer less codec/format for smaller binary size (include hevc function)
cd config
rm module.sh
ln -s module-lite-hevc.sh module.sh
cd android/contrib
If you prefer less codec/format for smaller binary size (by default)
cd config
rm module.sh
ln -s module-lite.sh module.sh
cd android/contrib

如果你需要支持更多的codec/format,可以选择第一种,不知道默认的ijkplayer的so是用的哪一种编译的。但是我们可能需要的不是那么多的解码器,如果全部都打的话,so会很大,所有我们可以使用最后一种编译so的方式,但要加入mpeg4的支持,打开config下面的module-lite.sh,在#./configure –list-decoders末尾加入下面一行:

export COMMON_FF_CFG_FLAGS=”$COMMON_FF_CFG_FLAGS –enable-decoder=mpeg4″就可以啦,这样编译的so就很小了,而且还支持mpeg4.

如果不想自己编译,比较懒,也可以使用别人编译好的,implementation ‘com.shuyu:gsyVideoPlayer-ex_so:6.0.3’,这里编译的so就支持更多的视频协议格式,如果想知道怎么编译的,也可以去看https://github.com/CarGuo/GSYVideoPlayer/blob/master/module-lite-more.sh,或者用这个脚本自己编译。

这样ijkplayer就可以播放mpeg4协议的视频了,测试通过,原来有问题的只有声音没有画面的视频可以正常播放了。

第二个问题是有一个视频播放很卡很卡,其他视频正常,这个很卡的视频,ios,h5都是正常的,先找原因,还是用ffmpeg命令查看视频的信息,然后和正常播放的视频的信息做对比,然后就发现这个视频的信息里,audio在前,video在后,其他能正常播放的视频的信息都是video在前,audio在后,然后我就先把视频的音频去掉,看看会有什么效果,结果发现一点都不卡了,肯定是音频导致的,或者说音频视频编码的时候,出了什么问题导致的,但是把音频去掉肯定不行,不能让别人只看视频不听声音啊,之前那个视频播放有声音没画面是因为当时的播放器不支持mpeg4,但是这个视频的格式是h264,不是mpeg4,说明不是同样的问题了,而且这个视频是第三方视频平台转码后的,猜测是转码后的视频音频出了问题,然后我就把这个有问题的视频下载下来通过本地ffmpeg的命令ffmpeg -i /Users/guoliuya/Downloads/o_1d514e1rn1jm524f1ejtg631r4g8.mp4 -vcodec libx264 -preset medium -b:v 2000k /Users/guoliuya/Downloads/o_1d514e1rn1jm524f1ejtg631r4g99.mp4,转码后得到的视频,再次播放就正常了,然后查看视频的信息发现转码后的视频信息audio ,video的位置正常了,video在前,audio在后了,然后把这个转码后的视频,交给后台,让他上传到服务器,问题就解决了,很卡的那个视频不卡了。

先记录一下这两个问题,以后有关于视频播放的问题再更新。


版权声明:本文为feng8888bbb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。