Я просто загружаю видеофайл с помощью модификации и конвертирую его в 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)
}
)
}
Этот код работает, когда вложение является изображением, но в видео я действительно не знаю, почему видео не воспроизводится.
Также я не знаю, почему приложение на мгновение зависает при вызове этого API-интерфейса getAttachmentFromMedia().
Я здесь правильно делаю или мне нужно что-то изменить?
Любая помощь приветствуется. Спасибо.
Вы имеете в виду, что я добавляю holder.videoView.start() в свой код?
Да, сэр, но это результат. все еще выскакивает imgur.com/a/DR2duEo и видео не работает?
Нет, я имею в виду, вы пытаетесь воспроизвести файл mp4 (который вы загрузили с сервера) с помощью любых видеоплееров на своем телефоне, чтобы убедиться, что это действительный видеофайл.
Я не пробовал воспроизводить файл с какого-либо видеоплеера, так как я просто создаю временный файл для видео.
Поскольку вы копируете файл из потока ввода в поток пользовательского интерфейса, вы видите, что приложение через некоторое время зависает.
Позвольте нам продолжить обсуждение в чате.
вы уверены, что ваше видео в формате, поддерживаемом ANdroid?
да, я не знаю, но видео теперь работает хорошо. Размер видео составляет около 6 МБ, и я просто увеличиваю размер buffer с val buffer = ByteArray(4 * 1024) до val buffer = ByteArray(10 * 1024), но я действительно не знаю, хорошо ли это.
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);
}
}
возникнут какие-либо проблемы с использованием этого кода, поэтому, пожалуйста, дайте мне знать.Спасибо
Он спросил, как играть из потока, а не из системного пути, URI и т. д. Спасибо
После загрузки файла на свое устройство воспроизведите видео по пути 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();
}
Вы пытаетесь воспроизвести файл mp4 на видеоплеерах?