Android VideoView无法从InputStream播放视频

Android VideoView无法从InputStream播放视频,android,kotlin,retrofit,Android,Kotlin,Retrofit,我只是下载视频文件使用改装和转换成tempFile,但转换后的视频无法播放 这就是我所做的 @Streaming @GET("media/attachment") fun getAttachmentFromMedia(): Observable<ResponseBody> fun getAttachment() { getApi().getAttachmentFromMedia() .subscribeOn(Schedulers.io())

我只是下载视频文件使用改装和转换成tempFile,但转换后的视频无法播放

这就是我所做的

@Streaming
@GET("media/attachment")
fun getAttachmentFromMedia(): Observable<ResponseBody>


fun getAttachment() {
    getApi().getAttachmentFromMedia()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            {
                if (fileType.contains("image")) { 
                    //.. some stuff here
                } else if (fileType.contains("video")) {
                    val tmpFile = File.createTempFile("default", ".mp4")
                    tmpFile.deleteOnExit()

                    try {
                        val output = FileOutputStream(tmpFile)
                        var read = 0
                        output.use { _ ->
                            val buffer = ByteArray(4 * 1024)
                            while (it.byteStream().read(buffer).let { read = it; read != -1 }) {
                                output.write(buffer, 0, read)
                            }
                            output.flush()
                        }
                    } finally {
                        it.byteStream().close()

                        val mediaController = MediaController(holder.itemView.context)
                        mediaController.setAnchorView(holder.videoView)
                        holder.videoView.setMediaController(mediaController)

                        holder.videoView.setVideoURI(Uri.fromFile(tmpFile))
                        holder.videoView.start()

                        holder.videoView.visibility = View.VISIBLE
                    }
                }
            },
            {
                Log.e(TAG, "getAttachment failed", it)
            }
        )
}
当附件是图像时,这个代码可以工作,但是在视频中,我真的不知道为什么视频不能播放

另外,我也不知道为什么在调用这个getAttachmentFromMedia api时应用程序会暂时冻结

我在这里做得对吗,还是应该做些改变


感谢您的帮助。谢谢。

在设备中下载文件后,从文件路径播放视频,如下所示

   VideoView videoView;


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoView = (VideoView)findViewById(R.id.ViewVideo);


        String videopath = "android.resource://com.example.cloudanalogy.play_video/"+R.raw.a; //com.example.cloudanalogy.play_video this is my package name,and inside the raw file a.mp4 video
        Uri vidUri = Uri.parse(videopath);
        videoView.setVideoURI(vidUri);
        videoView.start();
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);


    }
}
          try {
                pDialog.show();
                MediaController mediacontroller = new MediaController(this);
                mediacontroller.setAnchorView(videoview);
                Uri video = Uri.parse(VideoURL);
                videoview.setMediaController(mediacontroller);
                videoview.setVideoURI(video);
                videoview.requestFocus();
                videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                       pDialog.dismiss();
                       videoview.start();
                    }
                });
            } catch (Exception e) {
                pDialog.dismiss();
                e.printStackTrace();
            }
将下面的代码放在finally块中

MediaController mediaController = new MediaController(getActivity());
mediaController.setMediaPlayer(videoView);
videoView.setVideoURI(Uri.parse(mFilePath));
videoView.setMediaController(mediaController );
videoView.start();
像这样直接从视频url播放视频

          try {
                pDialog.show();
                MediaController mediacontroller = new MediaController(this);
                mediacontroller.setAnchorView(videoview);
                Uri video = Uri.parse(VideoURL);
                videoview.setMediaController(mediacontroller);
                videoview.setVideoURI(video);
                videoview.requestFocus();
                videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                       pDialog.dismiss();
                       videoview.start();
                    }
                });
            } catch (Exception e) {
                pDialog.dismiss();
                e.printStackTrace();
            }

您是否尝试在视频播放器上播放mp4文件?您的意思是我在代码中添加holder.videoView.start?是的,先生,但这是结果。仍然弹出,视频工作不正常?不,我的意思是你是否尝试使用手机上的任何视频播放器播放从服务器下载的mp4文件,以确保它是有效的视频文件。我没有尝试从任何视频播放器播放该文件,因为我只是为视频创建一个临时文件。如果使用此代码有任何问题,请告诉我。谢谢。他询问如何从流播放,而不是从系统路径、URI等。谢谢