Android应用开发之使用 Vitamio 播放视频作为 Splash 时出现失真情况的解决方案
白羽 2018-08-10 来源 :网络 阅读 1082 评论 0

摘要:本文将带你了解Android应用开发之使用 Vitamio 播放视频作为 Splash 时出现失真情况的解决方案,希望本文对大家学Android有所帮助

        本文将带你了解Android应用开发之使用 Vitamio 播放视频作为 Splash 时出现失真情况的解决方案,希望本文对大家学Android有所帮助


目前在做关于视频及流媒体播放项目时,有这样一个需求,应用启动时的 Splash 要求播放一段动画。其中视频播放的库使用是 Vitamio。

最开始要播放的文件比较大,有 18M+,在手机播放时画质非常好。但是一个 Splash 没有必要这么大,由于把视频压缩了下,变成了 1.5M+,这回文件大小是可以了,用电脑播放器播放时,画质和之前的大文件比没有太大的变化,但是在手机中播放时,却出现了很严重的失真现象。

这是怎么回事?最后经过调查,设置了一些参数,再次用手机播放时和电脑播放的效果一样了,没有出现失真的现象。现将完整解决方案与大家分享下:

说明:
代码中删除了和演示无关的业务代码。
测试用机: XiaoMi 2S Android 5.0.2

Java代码  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);      }  }  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);
    }
}    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程