从Android盒子HDMI输入读取原始视频流

7次阅读
没有评论

问题描述

希望开发一个应用程序,能够从具有HDMI输入端口的Android盒子中读取原始视频流,并在Android设备上通过VideoView显示。用户提到他们正在使用的Android盒子型号为Tronsmart Pavo M9,API级别为19(Android 4.4)。此外,用户还提供了Zidoo X9S盒子的信息,并表示已经订购了一款Zidoo 8盒子,希望能够获取更多相关信息。

解决方案

方案1:使用MediaProjection API

在Android 4.4及以上版本中,可以通过MediaProjection API来捕获屏幕内容,从而实现从HDMI输入读取视频流的功能。这种方法适用于Android盒子作为外部显示器的情况。

步骤

  1. 请求媒体投影权限
    在AndroidManifest.xml中添加以下权限:
    xml
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

  2. 申请媒体投影
    在应用程序中请求媒体投影权限,并开始媒体投影会话:
    “`java
    private MediaProjectionManager mediaProjectionManager;
    private MediaProjection mediaProjection;

// 请求媒体投影权限
mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent intent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(intent, REQUEST_CODE);

// 在onActivityResult中处理结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
}
}

// 开始媒体投影会话
public void startMediaProjection() {
// 使用MediaProjection对象进行屏幕捕获
Display defaultDisplay = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setOutputFile(“/sdcard/output.mp4”);
mediaRecorder.prepare();
mediaRecorder.start();

   Surface surface = new Surface(new SurfaceHolder(getBaseContext()));
   mediaProjection.createVirtualDisplay("display", defaultDisplay.getWidth(), defaultDisplay.getHeight(), defaultDisplay.getRefreshRate(), DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null);

}
“`

  1. 显示视频流
    使用VideoView播放捕获到的视频流:
    xml
    <VideoView
    android:id="@+id/video_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

java
VideoView videoView = findViewById(R.id.video_view);
videoView.setVideoPath("/sdcard/output.mp4");
videoView.start();

方案2:使用第三方库

还可以考虑使用第三方库来简化视频流的捕获和播放过程。例如,可以尝试使用VLCJ库,它支持从多种来源(包括HDMI输入)捕获视频流。

步骤

  1. 添加依赖
    在项目的build.gradle文件中添加VLCJ库依赖:
    gradle
    dependencies {
    implementation 'uk.co.caprica.vlcj:vlcj:3.6.3'
    }

  2. 初始化VLC实例
    java
    LibVlc libVlc = new LibVlc();
    Instance instance = new Instance(libVlc);
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(instance);
    MediaPlayer mediaPlayer = mediaPlayerFactory.newMediaPlayer();

  3. 设置视频源
    java
    mediaPlayer.setMedia(new Media(mediaPlayerFactory, "vifer://your_hdm_input_source"));
    mediaPlayer.play();

  4. 显示视频流
    使用VideoView或其他控件显示视频流:
    java
    VideoView videoView = findViewById(R.id.video_view);
    videoView.setVideoPath("/path/to/vlcj_output.mp4");
    videoView.start();

注意事项

  • 上述方法可能需要额外的权限和配置,具体取决于Android盒子的具体实现。
  • 使用MediaProjection API时,请确保遵守相关隐私政策和法律法规。
  • 第三方库的选择和使用可能会带来不同的性能和兼容性问题,建议进行充分的测试和验证。

以上两种方案均可以帮助用户从Android盒子的HDMI输入中读取原始视频流并在Android设备上显示。建议根据实际情况选择合适的方案进行实现。

正文完