VideoView не может воспроизводить видео из InputStream

Я просто загружаю видеофайл с помощью модификации и конвертирую его в 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)
            }
        )
}

VideoView не может воспроизводить видео из InputStream

Этот код работает, когда вложение является изображением, но в видео я действительно не знаю, почему видео не воспроизводится.

Также я не знаю, почему приложение на мгновение зависает при вызове этого API-интерфейса getAttachmentFromMedia().

Я здесь правильно делаю или мне нужно что-то изменить?

Любая помощь приветствуется. Спасибо.

Вы пытаетесь воспроизвести файл mp4 на видеоплеерах?

Son Truong 13.09.2018 03:12

Вы имеете в виду, что я добавляю holder.videoView.start() в свой код?

dotGitignore 13.09.2018 03:15

Да, сэр, но это результат. все еще выскакивает imgur.com/a/DR2duEo и видео не работает?

dotGitignore 13.09.2018 03:18

Нет, я имею в виду, вы пытаетесь воспроизвести файл mp4 (который вы загрузили с сервера) с помощью любых видеоплееров на своем телефоне, чтобы убедиться, что это действительный видеофайл.

Son Truong 13.09.2018 03:18

Я не пробовал воспроизводить файл с какого-либо видеоплеера, так как я просто создаю временный файл для видео.

dotGitignore 13.09.2018 03:20

Поскольку вы копируете файл из потока ввода в поток пользовательского интерфейса, вы видите, что приложение через некоторое время зависает.

Son Truong 13.09.2018 03:50

Позвольте нам продолжить обсуждение в чате.

Son Truong 13.09.2018 04:18

вы уверены, что ваше видео в формате, поддерживаемом ANdroid?

Vladyslav Matviienko 13.09.2018 07:03

да, я не знаю, но видео теперь работает хорошо. Размер видео составляет около 6 МБ, и я просто увеличиваю размер buffer с val buffer = ByteArray(4 * 1024) до val buffer = ByteArray(10 * 1024), но я действительно не знаю, хорошо ли это.

dotGitignore 13.09.2018 07:10
0
9
1 133
2

Ответы 2

   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);


    }
}

возникнут какие-либо проблемы с использованием этого кода, поэтому, пожалуйста, дайте мне знать.Спасибо

Vishal Sharma 13.09.2018 08:31

Он спросил, как играть из потока, а не из системного пути, URI и т. д. Спасибо

Sorry IwontTell 10.07.2020 15:51

После загрузки файла на свое устройство воспроизведите видео по пути file_path следующим образом.

Поместите приведенный ниже код в свой блок finally.

MediaController mediaController = new MediaController(getActivity());
mediaController.setMediaPlayer(videoView);
videoView.setVideoURI(Uri.parse(mFilePath));
videoView.setMediaController(mediaController );
videoView.start();

Воспроизведение видео прямо с video_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();
            }

Другие вопросы по теме