标签: openmax

通过Android中的OpenMAX访问摄像头

我目前正试图弄清楚如何通过Android 4.0中的OpenMAX访问相机.文档对我来说还不够,所以我目前很难找到如何XADataSource为以下调用检索正确的文档.

(*_engine)->CreateMediaRecorder(_engine,
                                &_mediaRecorder, //pRecorder
                                nullptr, //pAudioSrc
                                XADataSource *, //pImageVideoSrc
                                XADataSink *, //pDataSnk
                                XAuint32, // numInterfaces
                                const XAInterfaceID *, //pInterfaceIds
                                const XAboolean *, //pInterfaceRequired
);
Run Code Online (Sandbox Code Playgroud)

请不要让我使用Java - "答案".

c android android-ndk openmax

27
推荐指数
1
解决办法
2713
查看次数

Android MediaCodec AAC编码器

我使用MediaCodecAndroid SDK提供的类,因为API级别16与OMX.SEC.aac.enc编码器一起将音频编码为文件.我从AudioRecord课堂上得到了音频输入.我的AudioRecord类实例配置如下:

bufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_DEFAULT, bufferSize);
Run Code Online (Sandbox Code Playgroud)

我能够从AudioRecord实例播放原始数据,因此问题不在那里.

我将AudioRecord实例的输出写入ByteBuffer实例并将其传递给编码器的可用输入缓冲区.编码器的输出被写入SD卡上的文件.

这些是我的MediaCodec实例的配置参数:

codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)

VLC告诉我,我的aac文件中没有流.该命令FFMPEG -i @filename@给出了以下错误:处理输入时找到无效数据.我测试过的所有媒体播放器都无法播放我的文件.

为什么我无法播放我的文件?我没有收到OpenMAX错误,LogCat应用程序在编码时不会崩溃.我写了一个视频编码器,它的工作原理与之相同.

这是将数据从AudioRecord实例读取到缓冲区的代码:

    new Thread() {
        public void run() { …
Run Code Online (Sandbox Code Playgroud)

android aac audiorecord openmax mediacodec

22
推荐指数
1
解决办法
1万
查看次数

GPU去隔行扫描

我有一个应用程序,使用OpenGL进行颜色变换,缩放和翻译等视频处理.我主要使用BGRA(1xGL_BGRA)或YUVA(4xGL_R)视频,即包括alpha.

现在我还想做一些高质量的去隔行扫描.我注意到Nvidia通过其"PureVideo"功能支持高质量的硬件加速去隔行扫描.基本上我想要做的是发送带有x个颜色通道的隔行扫描OpenGL纹理,并获得两个渐进纹理.

我的问题是如何最简单,最有效地访问此功能(可能与OpenGL互操作)?

我一直在关注DXVA和OpenMax,但两者似乎都专注于播放(不是去隔行处理,即非相关选项,如帧速率需要设置等等)和无alpha格式......

c++ windows opengl openmax dxva

21
推荐指数
1
解决办法
3631
查看次数

在不使用OpenMAX的情况下解码Raspberry Pi中的视频?

我正在寻找一个直接在Raspberry Pi上解码视频的例子,而不使用OpenMAX.

这解释了多媒体软件的不同层次:

覆盆子Pi架构

还有一个未在此处显示的附加层," MMAL "层(我相信)是围绕OpenMAX的Broadcom包装器.(如果没有,它将是一个OpenMAX替代品,位于内核驱动程序之上)例如,使用MMAL编写raspivid和raspistill.

我想要一个视频解码的例子,其中输入是原始H.264,输出是内存中的视频或屏幕上的视频.我想直接使用VCHIQ这样做,而不是使用OpenMAX.(主要是出于性能和灵活性的原因)

这个github存储库:https://github.com/raspberrypi/userland/包含上面显示的所有内容的源(橙色和绿色框; VCHIQ本身的源代码,VCHIQ之上的OpenMAX IL实现,以及OpenGL和EGL实现,. ..).所以在理论上它应该足以开始.问题是如何使用它是非常不明显的,即使一个人非常熟悉OpenMAX和一般的多媒体框架.

例如:vchiq_bulk_transmit()似乎是用于将视频发送到解码器的功能.但是如何初始化类型的第一个参数VCHIQ_SERVICE_HANDLE_T?结果在哪里,在帧缓冲区中,或在结果句柄中,还是......?

编辑可以通过使用vchiq提供视频解码的工作示例,显示调用序列的API演练(尽管不是一个工作示例)或指向足够的文档来编写它来收集赏金.一个工作的例子将得到一个巨额额外的赏金:)

c video decode raspberry-pi openmax

17
推荐指数
1
解决办法
3438
查看次数

用基于ffmpeg的标准替换标准的Android H264软件编码器

在Android ICS及更高版本中,正在使用新的OpenMax IL API版本,使旧的二进制blob无用/未使用.这导致旧的设备,否则运行ICS只是很好和花花公子,以打破视频播放(例如,YouTube HQ和IMBD),因为与ffmpeg在同一设备上可以做的相比,Androids后备软件解码器很糟糕(我测试了MXPlayer + arm6vfp ffmpeg和720p电影回放很棒).

我正在尝试挖掘Android源代码,看看我可以添加/替换代码的位置和内容,以允许使用ffmpeg库的强大功能.问题是我不确切地知道正在使用什么代码,例如用于解码视频的YouTube应用程序,或者如何决定.

所以据我所知,我有两个选择:

  1. 找出当前使用的软件解码器,并尝试将其外部接口包装在ffmpeg周围,有效地替换当前使用的慢速软件解码器.最终结果将是单个.所以我可以推送到设备.

  2. 弄清楚如何欺骗Android思考基于ffmpeg的OMX库(我已经为Android成功构建了一个:limoa)并将其添加到所考虑的库列表中(或者更好:替换不可用的硬件编解码器).

作为扩展,我还希望通过这种方式使摄像机视频编码工作,因此非常需要真正的集成解决方案.问题是:如何,在哪里,以及什么?搜索Android源代码树可以在许多不同的地方提供大量的"H264"和相关内容.我需要最低和最简单的,所以我可以简单地包装假设decode(buffer)函数调用以使用ffmpeg(libavcodec).

c++ android ffmpeg android-ndk openmax

7
推荐指数
1
解决办法
3547
查看次数

MediaCodec如何在Android框架内找到编解码器?

我试图了解MediaCodec如何用于硬件解码.

我在android内部的知识非常有限.

以下是我的发现:

有一个xml文件,代表android系统中的编解码器细节.

 device/ti/omap3evm/media_codecs.xml for an example. 
Run Code Online (Sandbox Code Playgroud)

这意味着,如果我们使用Media Codec从Java Application创建编解码器

MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)

应该在xml文件的帮助下找出各自的编码器.

我在做什么?

我试图找出代码的哪一部分正在读取xml并根据给定的'type'找到编解码器.

1)应用层:

   MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)

2)MediaCodec.java - > [ frameworks/base/media/java/android/media/MediaCodec.java ]

     public static MediaCodec createDecoderByType(String type) {

    return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
Run Code Online (Sandbox Code Playgroud)

3)

private MediaCodec(
        String name, boolean nameIsType, boolean encoder) {
    native_setup(name, nameIsType, encoder);    --> JNI Call.
}
Run Code Online (Sandbox Code Playgroud)

4)JNI实现 - > [ frameworks/base/media/jni/android_media_MediaCodec.cpp ]

static void android_media_MediaCodec_native_setup (..) {
        .......
    const char *tmp = …
Run Code Online (Sandbox Code Playgroud)

android opencore android-internet stagefright openmax

7
推荐指数
1
解决办法
3224
查看次数

如何从OMX logcat消息开始调试MediaCodec错误?

使用MediaCodec,很多时候错误消息来自OMX层.如何使用它们来帮助调试不那么微不足道的问题?例如,我有一个应用程序有时无法创建用于解码h264流的编解码器.它似乎只发生在三星S4(I9505)等设备上,而S3,Nexus 4(旧)则没有发生.在大多数情况下,在S4上相同的视频被解码.在创建编解码器之前,有一些密集的计算,包括OpeGL的东西.它失败的那一行是:

MediaCodec.createByCodecName(codecInfo[0].getName());
Run Code Online (Sandbox Code Playgroud)

codecInfo[0].getName()具有值OMX.qcom.video.decoder.avc和在logcat的以下输出:

06-23 19:12:18.197: I/OMXClient(23749): Using client-side OMX mux.
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): In OMX vdec Constructor
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.ts value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.concealedmb value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.extradata value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Successfully opened vdec ion devicefd = 35
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Successfully created vdec ionlock
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Vdec instances = 1, ion device fd = 35
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): omx_vdec::component_init(): Start of New Playback …
Run Code Online (Sandbox Code Playgroud)

android openmax mediacodec

6
推荐指数
0
解决办法
5068
查看次数

Gstreamer在Raspberry pi上从JPEG生成游戏中时光时挂起

情况:

我想使用板载H.264编码器在我的Raspberry Pi 512mb上生成一个游戏中时光倒流.

输入:+300 JPEG文件(2592 x 1944像素),例如:http://i.imgur.com/czohiki.jpg

输出:h264视频文件(2592 x 1944像素)

GStreamer 1.0.8 + omxencoder(http://pastebin.com/u8T7mE18)

Raspberry Pi版本:2013年6月17日20:45:38版本d380dde43fe729f043befb5cf775f99e54586cde(干净)(发布)

内存:gpu_mem_512 = 400

Gstreamer管道:

sudo gst-launch-1.0 -v multifilesrc location = GOPR%04d.JPG start-index = 4711 stop-index = 4750 caps ="image/jpeg,framerate =(fraction)25/1"do-timestamp = true!omxmjpegdec!视频!video/x-raw,帧率= 1/5!视频转换!omxh264enc!"video/x-h264,profile = high"!h264parse!queue max-size-bytes = 10000000!matroskamux!filesink location = test.mkv --gst-debug = 4

问题: Gstreamer挂起,没有输出.

--gst调试= 4:

0:00:01.027331700 2422 0x17824f0 INFO GST_EVENT gstevent.c:709:gst_event_new_segment:创建段事件时间段start = 0:00:00.000000000,stop = 99:99:99.999999999,rate = 1.000000,applied_rate = 1.000000,flags = 0x00, time = 0:00:00.000000000,base = …

video-processing gstreamer raspberry-pi openmax

5
推荐指数
1
解决办法
1352
查看次数

开发H264硬件解码器Android-Stagefright还是OpenMax IL?

我正在为Android开发H264硬件加速视频解码器。到目前为止,我已经过来和一些图书馆MediaCodecStagefrightOpenMax ILOpenMax ALFFmpeg。经过一些研究,我发现-

  1. 我发现了将stagefright与FFmpeg一起使用的绝妙资源,但是我不能将FFmpeg用作其许可证,因为它对分布式软件有很大的限制。(或者可以从这种方法中丢弃FFmpeg吗?)

  2. 我不能将MediaCodec用作Java API,而必须通过C ++层的JNI调用它,它相对较慢,因此不允许使用。

  3. 我不能使用OpenMax AL,因为它仅支持通过缓冲区队列对MPEG-2传输流进行解码。这排除了为此传递原始h264 NALU或其他媒体格式的可能性。

  4. 现在只剩下-stagefright和OpenMax IL。我知道stagefright使用OpenMax(OMX)接口。那我应该选择Stagefright还是OpenMax IL?哪个会更有前途?

另外,我知道Android H / W加速解码器是特定于供应商的,每个供应商都有自己的OMX接口API。是真的吗 如果是这样,在OpenMax IL的情况下,我是否需要编写硬件供应商特定的实现?那stagefright呢?-是否与硬件无关或与硬件相关?如果无法使用stagefright或OpenMax IL进行H / W indenpent实现,则我至少需要支持Qualcomm的Snapdragon,三星的Exynos和Tegra-4。

请注意,我需要解码H264附件B流,并希望在解码后将解码后的数据发送到视频渲染管道。因此,基本上,我只需要解码器模块。

我真的很困惑。请帮助我正确的方向。提前致谢!

编辑

我的软件用于商业目的,源代码也是私有的。而且我也被客户端限制使用ffmpeg。:)

c++ h.264 android-ndk stagefright openmax

5
推荐指数
1
解决办法
3287
查看次数

如何或在何处指定omx解码器支持隧道

BSP支持Hw加速编解码器的隧道传输.Android用于feature-tunneled-playback检查是否支持隧道.如果是,它将尝试配置隧道.如何实现或指定android扩展OMX.google.android.index.configureVideoTunnelMode

只是说对于隧道播放支持,应该支持扩展.如何公开这个扩展,以便android将支持隧道?

android openmax mediacodec android-mediacodec

5
推荐指数
1
解决办法
449
查看次数