[原创] 使用 Vitamio 播放视频作为 Splash 时出现失真情况的解决方案 博客分类: Android androidvideovitamiosplash
程序员文章站
2024-03-15 13:32:23
...
目前在做关于视频及流媒体播放项目时,有这样一个需求,应用启动时的 Splash 要求播放一段动画。其中视频播放的库使用是 Vitamio。
最开始要播放的文件比较大,有 18M+,在手机播放时画质非常好。但是一个 Splash 没有必要这么大,由于把视频压缩了下,变成了 1.5M+,这回文件大小是可以了,用电脑播放器播放时,画质和之前的大文件比没有太大的变化,但是在手机中播放时,却出现了很严重的失真现象。
这是怎么回事?最后经过调查,设置了一些参数,再次用手机播放时和电脑播放的效果一样了,没有出现失真的现象。现将完整解决方案与大家分享下:
说明:
代码中删除了和演示无关的业务代码。
测试用机: XiaoMi 2S Android 5.0.2
备注
Vitamio官网地址:https://www.vitamio.org/
最开始要播放的文件比较大,有 18M+,在手机播放时画质非常好。但是一个 Splash 没有必要这么大,由于把视频压缩了下,变成了 1.5M+,这回文件大小是可以了,用电脑播放器播放时,画质和之前的大文件比没有太大的变化,但是在手机中播放时,却出现了很严重的失真现象。
这是怎么回事?最后经过调查,设置了一些参数,再次用手机播放时和电脑播放的效果一样了,没有出现失真的现象。现将完整解决方案与大家分享下:
说明:
代码中删除了和演示无关的业务代码。
测试用机: XiaoMi 2S Android 5.0.2
import android.app.Activity; import android.content.Intent; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; // ...... 省略其它不必要的 import import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.Vitamio; import io.vov.vitamio.widget.VideoView; public class SplashActivity extends Activity { private static final String TAG = SplashActivity.class.getSimpleName(); /** * Duration of wait * */ private static final int SPLASH_DISPLAY_LENGTH = 2500; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); Vitamio.isInitialized(getApplicationContext()); InputStream ins = getResources().openRawResource(R.raw.splash_anim); File tmpFile = null; OutputStream output; try { tmpFile = File.createTempFile("splash", "mov"); output = new FileOutputStream(tmpFile); final byte[] buffer = new byte[102400]; int read; while ((read = ins.read(buffer)) != -1) { output.write(buffer, 0, read); } output.flush(); output.close(); ins.close(); } catch (IOException e) { e.printStackTrace(); } final io.vov.vitamio.widget.VideoView videoView = new VideoView(this); videoView.setHardwareDecoder(true); videoView.setVideoChroma(MediaPlayer.VIDEOCHROMA_RGB565); // This method below will remove the black screen that appears before playing video videoView.setZOrderOnTop(true); videoView.setVideoPath(tmpFile.getPath()); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { // optional need Vitamio 4.0 ALog.i(TAG, "onPreparedListener()"); videoView.setBackground(null); mediaPlayer.setAdaptiveStream(true); mediaPlayer.setPlaybackSpeed(1.0f); mediaPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); setVolumeControlStream(AudioManager.STREAM_MUSIC); mediaPlayer.prepareAsync(); mediaPlayer.start(); } }); setContentView(videoView); new Handler().postDelayed(new Runnable() { @Override public void run() { ALog.d(TAG, "Ready to start initialization activity"); Intent intent = new Intent(SplashActivity.this, Mainctivity.class); startActivity(intent); finish(); } }, SPLASH_DISPLAY_LENGTH); } }
备注
Vitamio官网地址:https://www.vitamio.org/