[chatGPT] 如何通过JNI在Android上显示实时视频流

这篇具有很好参考价值的文章主要介绍了[chatGPT] 如何通过JNI在Android上显示实时视频流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

相机拍摄的画面通过local socket 获取,所以C++的代码可以轻易的获取到每一帧视频数据,需要通过JNI 让 Android显示出来,方法有两种,一种是在Android内创建回调函数使用Bitmap 和ImageView 进行赋值显示,另一种也就是ChatGPT完成的,Android将surface 传递到JNI层内,C++来完成赋值和渲染,后者效率更高。
本文通过和ChatGPT的对话来描述代码的实现过程。

正文

礼貌性问候一下。
[chatGPT] 如何通过JNI在Android上显示实时视频流
开始吧:
[chatGPT] 如何通过JNI在Android上显示实时视频流

MediaPlayer mediaPlayer = new MediaPlayer();
SurfaceView surfaceView = findViewById(R.id.surface_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();

mediaPlayer.setDataSource("http://your_video_stream.mp4");
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.prepare();
mediaPlayer.start();

[chatGPT] 如何通过JNI在Android上显示实时视频流
[chatGPT] 如何通过JNI在Android上显示实时视频流

layout xml
<SurfaceView
    android:id="@+id/surface_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
java
SurfaceView surfaceView = findViewById(R.id.surface_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
C++
#include <jni.h>
#include <android/native_window_jni.h>
#include <android/native_window.h>
#include <unistd.h>

// ...

extern "C"
JNIEXPORT void JNICALL
Java_com_example_NativeVideoPlayer_playVideo(JNIEnv *env, jobject instance, jobject surface) {
    ANativeWindow *window = ANativeWindow_fromSurface(env, surface);
    ANativeWindow_setBuffersGeometry(window, 720, 480, WINDOW_FORMAT_RGBA_8888);

    while (true) {
        // Capture and decode the video stream
        // ...

        // Render the decoded video frame to the surface
        // ...

        // Sleep for a short period of time
        usleep(16000);
    }

    ANativeWindow_release(window);
}
java
public class NativeVideoPlayer {
    static {
        System.loadLibrary("native-video-player");
    }

    public native void playVideo(SurfaceHolder surfaceHolder);
}

// ...

NativeVideoPlayer player = new NativeVideoPlayer();
player.playVideo(surfaceHolder);

总结一:

整体思路是创建一个surface 然后将surface 的 surface holder 传递到 JNI。
但是没有写如何赋值给surface holder 那我们继续问。

追问:

[chatGPT] 如何通过JNI在Android上显示实时视频流

C++
jobject surface = env->GetObjectField(surfaceHolder, surfaceFieldID);
// ...
ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);
//...
ANativeWindow_setBuffersGeometry(nativeWindow, width, height, format);
//...
ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(nativeWindow, &buffer, NULL) == 0) {
  // Assign video stream buffer to the ANativeWindow
  // ...

  ANativeWindow_unlockAndPost(nativeWindow);
}

[chatGPT] 如何通过JNI在Android上显示实时视频流

C++
if (ANativeWindow_lock(nativeWindow, &buffer, NULL) == 0) {
  // Assign video stream buffer to the ANativeWindow
  uint8_t *dst = static_cast<uint8_t *>(buffer.bits);
  memcpy(dst, yuvBuffer, buffer.stride * buffer.height);

  ANativeWindow_unlockAndPost(nativeWindow);
}

总结二:

到这里基本的代码已经全部写出来了,只需要每次把图像数据写入 到 window 的buffer 中就好。
但是难免有什么不理解或者不对的地方,那我们就继续让它答疑解惑吧。

答疑解惑

首先有一个问题,就是我没有从surfaceHolder找到surface。

C++
jclass surfaceHolderClass = env->GetObjectClass(surfaceHolder);
jfieldID surfaceFieldID = env->GetFieldID(surfaceHolderClass, "mSurface", "Landroid/view/Surface;");

jobject surface = env->GetObjectField(surfaceHolder, surfaceFieldID);

[chatGPT] 如何通过JNI在Android上显示实时视频流

[chatGPT] 如何通过JNI在Android上显示实时视频流
然后我就去找新的接口,发现一个getSurface的接口。我自己做了下面的调整:

jmethodID getSurfaceMethodID = env->GetMethodID(surface_hoder_class, "getSurface", "()Landroid/view/Surface;");
jobject surface = env->CallObjectMethod(surface_holder, getSurfaceMethodID);
if(surface == nullptr){}

然后反问它
[chatGPT] 如何通过JNI在Android上显示实时视频流
剩下的就是学习和真的答疑解惑了:
[chatGPT] 如何通过JNI在Android上显示实时视频流

[chatGPT] 如何通过JNI在Android上显示实时视频流
[chatGPT] 如何通过JNI在Android上显示实时视频流
到这里应该就结束了
.

画蛇添足 视频不显示黑屏

我其实画蛇添足还出了一个问题,ChatGPT 没帮我解决我自己找到的,后来我告诉机器人,下次遇到这样的事情,可以提醒一下其他人,看吧:
[chatGPT] 如何通过JNI在Android上显示实时视频流
因为用到OpenGL 所以要加载一些依赖项。
[chatGPT] 如何通过JNI在Android上显示实时视频流文章来源地址https://www.toymoban.com/news/detail-425299.html

最后感叹科技的更新速度,真的程序员都可能会被替代,下一个时代最大的问题应该是劳动力过剩,导致社会性结构改变,一部分人会被社会性抛弃。

到了这里,关于[chatGPT] 如何通过JNI在Android上显示实时视频流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 海康实时监控预览视频流接入web

            我们采取的方案是后端获取视频流返回给前端,然后前端播放 根据官方文档传输对应的参数  官方接口限制:为保证数据的安全性,取流URL设有有效时间,有效时间为5分钟。 注意不同协议的限制不同,rtsp没得限制但前端播放麻烦,web端展示的话ws比较好 海康开放平

    2024年04月17日
    浏览(48)
  • OpenCV获取网络摄像头实时视频流

    参考文章: [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头 [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头_落痕的寒假的博客-CSDN博客 在使用OpenCv处理视频时,无论是视频文件还是摄像头画面,都要使用VideoCapture类来进行每一帧图像的处理。当我们

    2024年02月01日
    浏览(64)
  • 设计一个像ESPN一样的实时视频流系统

    功能需求 •直播事件与流之间的最大延迟不超过1分钟•系统应能够适应大量用户(异构交付)•系统应能将视频转换为不同的分辨率和编解码器•系统应具备容错性 视频转换和接收 由于我们正在实时直播整个事件,因此我们不能等待整个视频结束后再开始将其转换为不同的

    2024年02月07日
    浏览(36)
  • 【精选】基于OpenCV的实时视频流车牌识别(源码&教程)

    近年来,智能交通系统(ITS)在我国应用日益广泛。作为ITS重要组成部分的自动车牌识别系统在交通流量检测、交通诱导控制、违章车辆监控等方面有着广泛的应用,是确保道路安全畅通的重要手段,也为统计有关资料,为管理者决策提供有效数字依据的重要途径。由于一般的识别系

    2024年01月23日
    浏览(64)
  • FFmpeg+SDL实时解码和渲染H264视频流

    之前实现了Android手机摄像头数据的TCP实时传输,今天接着聊聊,如何在PC端把接收到的H264视频流实时解码并渲染出来。这次使用的语言是C++,框架有FFmpeg和SDL2。 解码部分使用FFmpeg,首先,需要初始化H264解码器: 然后,使用创建TCP连接到我们的Android端,读取数据包: 再把每

    2024年02月13日
    浏览(47)
  • 基于OpenCv+Django的网络实时视频流传输(前后端分离)

    秋风阁——北溪入江流:https://focus-wind.com/ 秋风阁——基于OpenCv+Django的网络实时视频流传输(前后端分离) 使用OpenCv捕获摄像机画面后,我们有时候需要将画面显示在界面上。本博客基于Django的前后端分离模式,将视频流从后端读取,传送给前端显示。 在使用Django进行视频

    2024年02月08日
    浏览(53)
  • Qt推流程序自动生成网页远程查看实时视频流(视频文件/视频流/摄像头/桌面转成流媒体rtmp+hls+webrtc)

    推流程序将视频流推送到流媒体服务器后,此时就等待验证拉流播放,一般可以选择ffplay命令行播放或者vlc等播放器打开播放,也可以选择网页直接打开拉流地址播放,一般主流的浏览器都支持网页直接播放hls/m3u8/webrtc类型的视频流,而且推流的主要目的可能就是为了能够在

    2024年02月05日
    浏览(80)
  • VUE3 播放RTSP实时、回放(NVR录像机)视频流(使用WebRTC)

    1、下载webrtc-streamer,下载的最新window版本 Releases · mpromonet/webrtc-streamer · GitHub  2、解压下载包  3、webrtc-streamer.exe启动服务 (注意:这里可以通过当前文件夹下用cmd命令webrtc-streamer.exe -o这样占用cpu会很少,直接双击exe文件会占用cpu) cmd  webrtc-streamer.exe -o 启动如下图所示,

    2024年04月12日
    浏览(63)
  • 记录对接海康威视摄像头web端实时预览:Linux+ffmpeg+nginx转换RTSP视频流(完整版实现)

            需求:web端实现海康摄像头实时预览效果         由于市面上大部分网络摄像头都支持RTSP协议视频流,web端一般无法直接使用RTSP实现视频预览,本篇使用ffmpeg对视频流进行转换,最终实现web端实时预览。         工具介绍:ffmpeg、nginx、vue         介

    2024年01月25日
    浏览(57)
  • WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

    本篇博客的由来如上图哈哈,WSL2 相关安装教程可以参考我之前的博客:Win11安装WSL2和Nvidia驱动 更多文章欢迎来我的博客小站看呀,会有更多的技术细节~ ubuntu上请执行 或者编译安装 如果报错 Could NOT find OpenSSL ,安装如下依赖即可解决 下载解压 EasyDarwin Easydarwin是国内团队开

    2024年02月09日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包