网络视频流完善
parent
dc4c10c9a7
commit
f1c946172b
@ -0,0 +1,327 @@
|
||||
//package com.xypower.mpremote;
|
||||
//
|
||||
//import android.app.AlertDialog;
|
||||
//import android.content.Intent;
|
||||
//import android.os.Bundle;
|
||||
//import android.os.Handler;
|
||||
//import android.util.Log;
|
||||
//import android.view.Menu;
|
||||
//import android.view.MenuItem;
|
||||
//import android.view.View;
|
||||
//import android.widget.Toast;
|
||||
//
|
||||
//import androidx.annotation.NonNull;
|
||||
//import androidx.annotation.OptIn;
|
||||
//import androidx.appcompat.app.AppCompatActivity;
|
||||
//import androidx.media3.common.MediaItem;
|
||||
//import androidx.media3.common.PlaybackException;
|
||||
//import androidx.media3.common.Player;
|
||||
//import androidx.media3.common.util.UnstableApi;
|
||||
//import androidx.media3.common.util.Util;
|
||||
//import androidx.media3.exoplayer.DefaultLoadControl;
|
||||
//import androidx.media3.exoplayer.DefaultRenderersFactory;
|
||||
//import androidx.media3.exoplayer.ExoPlayer;
|
||||
//import androidx.media3.exoplayer.RenderersFactory;
|
||||
//import androidx.media3.exoplayer.rtsp.RtspMediaSource;
|
||||
//import androidx.media3.ui.PlayerView;
|
||||
//
|
||||
//import com.xypower.mpremote.databinding.ActivityStreamBinding;
|
||||
//import com.xypower.mpremote.utils.AdbUtils;
|
||||
//import com.xypower.mpremote.utils.AlertDialogUtils;
|
||||
//import com.xypower.mpremote.utils.AppUtils;
|
||||
//
|
||||
//import dadb.AdbShellResponse;
|
||||
//import dadb.Dadb;
|
||||
//
|
||||
//
|
||||
//@UnstableApi public class Stream2Activity extends AppCompatActivity implements View.OnClickListener {
|
||||
//
|
||||
// private static final String TAG = "STRM";
|
||||
// private static final int MAX_RETRIES = 5;
|
||||
//
|
||||
// private ExoPlayer player;
|
||||
// private String mDeviceIp;
|
||||
// private Handler retryHandler = new Handler();
|
||||
// @NonNull
|
||||
// private ActivityStreamBinding binding;
|
||||
// private String localIp;
|
||||
// private int cameraId;
|
||||
// private int anInt;
|
||||
// private int rotation;
|
||||
// private int netCamera;
|
||||
// private int vendor;
|
||||
// private int retryCount;
|
||||
// private static final long INITIAL_RETRY_DELAY_MS = 1000; // 初始重试延迟
|
||||
// private static final long MAX_RETRY_DELAY_MS = 15000; // 最大重试延迟
|
||||
// private static final float RETRY_BACKOFF_MULTIPLIER = 1.5f; // 退避乘数
|
||||
// private long currentRetryDelay = INITIAL_RETRY_DELAY_MS;
|
||||
// private boolean isBuffering = false;
|
||||
// private long bufferingStartTime = 0;
|
||||
// private static final long BUFFERING_TIMEOUT_MS = 100000; // 10秒缓冲超时
|
||||
// private String RTMP_URL;
|
||||
// private PlayerView playerView;
|
||||
// private AlertDialog alertDialog;
|
||||
//
|
||||
// @Override
|
||||
// protected void onCreate(Bundle savedInstanceState) {
|
||||
// super.onCreate(savedInstanceState);
|
||||
// binding = ActivityStreamBinding.inflate(getLayoutInflater());
|
||||
// setContentView(binding.getRoot());
|
||||
// initHandler();
|
||||
// initIntent();
|
||||
// initView();
|
||||
// initEvent();
|
||||
// }
|
||||
//
|
||||
// private void initEvent() {
|
||||
// Runnable runnable = new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// initializePlayer();
|
||||
// }
|
||||
// };
|
||||
// runnable.run();
|
||||
// }
|
||||
//
|
||||
// private void initHandler() {
|
||||
// }
|
||||
//
|
||||
// private void initIntent() {
|
||||
// Intent intent = getIntent();
|
||||
// mDeviceIp = intent.getStringExtra("deviceIp");
|
||||
// localIp = intent.getStringExtra("localIp");
|
||||
// cameraId = intent.getIntExtra("cameraId", 0);
|
||||
// anInt = intent.getIntExtra("channel", 1);
|
||||
// rotation = intent.getIntExtra("rotation", -1);
|
||||
// netCamera = intent.getIntExtra("netCamera", 0);
|
||||
// vendor = intent.getIntExtra("vendor", 0);
|
||||
// }
|
||||
//
|
||||
// private void initView() {
|
||||
// String versionName = AppUtils.getAppNameWithVersion(this);
|
||||
// binding.toolbar.title.setText(versionName);
|
||||
// binding.toolbar.refresh.setVisibility(View.VISIBLE);
|
||||
// binding.toolbar.back.setOnClickListener(this);
|
||||
// binding.toolbar.refresh.setOnClickListener(this);
|
||||
// playerView = binding.playerView;
|
||||
// }
|
||||
//
|
||||
// private void startStreaming(final String cmd, final Runnable runnable) {
|
||||
// Thread th = new Thread(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// Dadb adb = null;
|
||||
// try {
|
||||
// Log.i(TAG, "Start connecting " + mDeviceIp);
|
||||
// adb = AdbManager.getAdb(mDeviceIp, AdbUtils.DEFAULT_ADB_PORT);
|
||||
// Log.i(TAG, "Finish connecting " + mDeviceIp);
|
||||
// if (adb == null) {
|
||||
// retryHandler.postDelayed(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// Toast.makeText(Stream2Activity.this, R.string.err_dev_failed_to_connect, Toast.LENGTH_LONG).show();
|
||||
// }
|
||||
// }, 100);
|
||||
// return;
|
||||
// }
|
||||
// AdbShellResponse adbShellResponse = null;
|
||||
// try {
|
||||
// adbShellResponse = adb.shell("am force-stop com.xypower.mplive");
|
||||
// Thread.sleep(200);
|
||||
// } catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
// }
|
||||
// try {
|
||||
// adbShellResponse = adb.shell(cmd);
|
||||
// } catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
// }
|
||||
// if (adbShellResponse != null) {
|
||||
// if (adbShellResponse.getExitCode() == 0) {
|
||||
// try {
|
||||
// Thread.sleep(5000);
|
||||
// } catch (Exception ex) {
|
||||
// }
|
||||
// runOnUiThread(runnable);
|
||||
// }
|
||||
// }
|
||||
// } catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// th.start();
|
||||
// }
|
||||
//
|
||||
// private void stopStreaming() {
|
||||
// String cmd = "am force-stop com.xypower.mplive";
|
||||
// Thread th = new Thread(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// Dadb adb = null;
|
||||
// try {
|
||||
// Log.i(TAG, "Start connecting " + mDeviceIp);
|
||||
// adb = AdbManager.getAdb(mDeviceIp, AdbUtils.DEFAULT_ADB_PORT);
|
||||
// Log.i(TAG, "Finish connecting " + mDeviceIp);
|
||||
// if (adb == null) {
|
||||
// return;
|
||||
// }
|
||||
// AdbShellResponse adbShellResponse = null;
|
||||
// try {
|
||||
// adbShellResponse = adb.shell(cmd);
|
||||
// } catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
// }
|
||||
// if (adbShellResponse != null) {
|
||||
// if (adbShellResponse.getExitCode() == 0) {
|
||||
// }
|
||||
// }
|
||||
// } catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// th.start();
|
||||
// }
|
||||
//
|
||||
// private void initializePlayer() {
|
||||
// if (player == null) {
|
||||
//
|
||||
// // 创建一个默认的 RenderersFactory
|
||||
// RenderersFactory renderersFactory = new DefaultRenderersFactory(this)
|
||||
// .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
|
||||
// player = new ExoPlayer.Builder(this).setRenderersFactory(renderersFactory)
|
||||
// .setLoadControl(new DefaultLoadControl()).build();
|
||||
// playerView.setPlayer(player);
|
||||
// player.addListener(new Player.Listener() {
|
||||
// @Override
|
||||
// public void onPlayerError(PlaybackException error) {
|
||||
// Log.e(TAG, "播放错误: " + error.getMessage());
|
||||
// Log.e(TAG, "播放错误: " + error.getCause());
|
||||
// Log.e(TAG, "播放错误: " + error.getErrorCodeName());
|
||||
// handlePlaybackError();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onPlaybackStateChanged(int state) {
|
||||
// if (state == Player.STATE_BUFFERING) {
|
||||
// if (!isBuffering) {
|
||||
// isBuffering = true;
|
||||
// bufferingStartTime = System.currentTimeMillis();
|
||||
// // 启动缓冲超时检查
|
||||
// retryHandler.postDelayed(bufferingTimeoutRunnable, BUFFERING_TIMEOUT_MS);
|
||||
// }
|
||||
// } else if (state == Player.STATE_READY) {
|
||||
// AlertDialogUtils.dismiss(alertDialog);
|
||||
// isBuffering = false;
|
||||
// retryHandler.removeCallbacks(bufferingTimeoutRunnable);
|
||||
// retryCount = 0;
|
||||
// currentRetryDelay = INITIAL_RETRY_DELAY_MS;
|
||||
// Log.d(TAG, "播放器准备就绪");
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// startPlayback();
|
||||
// }
|
||||
//
|
||||
// private Runnable bufferingTimeoutRunnable = new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// if (isBuffering) {
|
||||
// Log.w(TAG, "缓冲超时,触发重连");
|
||||
// handlePlaybackError();
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// private void startPlayback() {
|
||||
// if (player == null) return;
|
||||
// Log.d(TAG, "开始播放,重试次数: " + retryCount);
|
||||
// MediaItem mediaItem = MediaItem.fromUri("rtsp://61.169.135.146:1554/live/abc");
|
||||
// RtspMediaSource mediaSource = new RtspMediaSource.Factory().createMediaSource(mediaItem);
|
||||
// player.setMediaItem(mediaItem);
|
||||
// player.prepare();
|
||||
// player.setPlayWhenReady(true);
|
||||
// }
|
||||
//
|
||||
// private void handlePlaybackError() {
|
||||
// releasePlayerInternal();
|
||||
// if (retryCount < MAX_RETRIES) {
|
||||
// retryCount++;
|
||||
// Log.d(TAG, "准备重试 (" + retryCount + "), 延迟: " + currentRetryDelay + "ms");
|
||||
// retryHandler.postDelayed(() -> {
|
||||
// initializePlayer();
|
||||
// // 增加下次重试的延迟时间(使用退避算法)
|
||||
// currentRetryDelay = Math.min((long) (currentRetryDelay * RETRY_BACKOFF_MULTIPLIER), MAX_RETRY_DELAY_MS);
|
||||
// }, currentRetryDelay);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private void releasePlayerInternal() {
|
||||
// if (player != null) {
|
||||
// player.release();
|
||||
// player = null;
|
||||
// isBuffering = false;
|
||||
// retryHandler.removeCallbacks(bufferingTimeoutRunnable);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onDestroy() {
|
||||
// super.onDestroy();
|
||||
// AlertDialogUtils.dismiss(alertDialog);
|
||||
// releasePlayerInternal();
|
||||
// stopStreaming();
|
||||
// }
|
||||
//
|
||||
// @OptIn(markerClass = UnstableApi.class)
|
||||
// @Override
|
||||
// protected void onPause() {
|
||||
// super.onPause();
|
||||
// if (Util.SDK_INT < 24) {
|
||||
// releasePlayerInternal();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @OptIn(markerClass = UnstableApi.class)
|
||||
// @Override
|
||||
// protected void onStop() {
|
||||
// super.onStop();
|
||||
// if (Util.SDK_INT >= 24) {
|
||||
// releasePlayerInternal();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// // Inflate the menu; this adds items to the action bar if it is present.
|
||||
// getMenuInflater().inflate(R.menu.stream_activity_actions, menu);
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// int id = item.getItemId();
|
||||
// switch (id) {
|
||||
// case android.R.id.home: //返回键的id
|
||||
// initializePlayer();
|
||||
// return false;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// return super.onOptionsItemSelected(item);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(View v) {
|
||||
// switch (v.getId()) {
|
||||
// case R.id.back:
|
||||
// finish();
|
||||
// break;
|
||||
// case R.id.refresh:
|
||||
// initEvent();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//}
|
Loading…
Reference in New Issue