从原生 C 代码 NDK 启动 Android Java VM使用 ffmpeg 媒体编解码器

问题描述

我设法为 armv8a api 27 cross-compile ffmpeg using the NDK 提供了MediaCodec 硬件加速支持

在设置权限、文件夹和正确设置 LD_LIBRARY_PATH 等之后使用 root。我可以在终端会话 (ssh) 上毫无问题地运行它。仅当我不尝试使用 -hwaccel 选项时。

如果尝试使用 -hwaccel 运行某些东西,例如:

ffmpeg -rtsp_transport tcp -an -hwaccel mediacodec -c:v hevc_mediacodec -i rtsp://user:pass@192.168.0.100:554/onvif1 -f null - -benchmark

我收到关于 No Java virtual machine错误

...
Input #0,rtsp,from 'rtsp://user:pass@192.168.0.100:554/onvif1':
  Metadata:
    title           : H.265 Video,RtspServer_0.0.0.2
  Duration: N/A,start: 0.000000,bitrate: N/A
    Stream #0:0: Video: hevc (Main),yuv420p(tv,bt470bg),1920x1080 [SAR 1:1 DAR 16:9],10 fps,10 tbr,90k tbn,10 tbc
    Stream #0:1: Audio: pcm_alaw,8000 Hz,mono,s16,64 kb/s
[amediaformat @ 0x7e2ea27300] No Java virtual machine has been registered
[hevc_mediacodec @ 0x7e2eb44f00] Failed to create media format
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (hevc_mediacodec) -> wrapped_avframe (native))
Error while opening decoder for input stream #0:0 : Generic error in an external library

是否可以直接从 C 代码启动(创建或启动?)Dalvik Java VM?我什至不知道这些术语是否正确。让它对 ffmpeg 可见?

任何可以帮助 Android 新手 站起来的信息都将不胜感激。如果可能的话,我会在 ffmpeg 代码上写一个小补丁。

我真的不想把它打包到一个应用程序中,只是为了能够测试这个。

解决方法

如果您使用 AOSP 工具构建可执行文件,则可以instantiate an AndroidRuntime,这将为您提供 JVM,另请参阅 app_process 命令。

为 AOSP 编译某些东西的传统方法是遵循 official instructions 并将您的可执行文件添加到构建中。但是您可以尝试使用系统标头并从您的设备(或模拟器)中提取要链接的共享库。