Articles of mediacodec

Android MediaCodec中的错误代码-1010是什么意思?

这是堆栈跟踪: E/ACodec: [OMX.qcom.video.encoder.avc] configureCodec returning error -1010 E/ACodec: signalError(omxError 0x80001001, internalError -1010) E/MediaCodec: Codec reported err 0xfffffc0e, actionCode 0, while in state 3 E/MediaCodec: configure failed with err 0xfffffc0e, resetting… W/System.err: android.media.MediaCodec$CodecException: Error 0xfffffc0e W/System.err: at android.media.MediaCodec.native_configure(Native Method) W/System.err: at android.media.MediaCodec.configure(MediaCodec.java:1778) 崩溃在Nexus 6P上。 mediaCodec的初始化: videoCodec = MediaCodec.createEncoderByType(MIME_VIDEO_CODEC_H264); MediaFormat videoFormat = MediaFormat.createVideoFormat(MIME_VIDEO_CODEC_H264, imageWidth, imageHeight); videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, camera.getBitrate()); […]

如何初始化MediaFormat以配置MediaCodec来解码原始AAC数据?

我的StreamPlayer有一个奇怪的问题,我需要任何帮助。 我需要实现的主要目标是StreamPlayer,它能够以尽可能小的延迟回放MPEG-2传输流。 为此,我遵循这种方法: 该流由基于Java的TS Parser解析。 我已经实现了一个类似于MediaExtractor的TSExtractor,它工作正常。 我可以像使用MediaExtractor一样接收选定轨道的所有媒体样本 extractor.readSampleData(…); extractor.advance(); 要解码我想要创建和配置MediaCodec实例的AAC数据。 使用MediaExtractor类通常由此完成 MediaFormat mediaFormat = extractor.getTrackFormat(i); decoder = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME)); decoder.configure(mediaFormat, null, null, 0); 因为我必须在TSExtractor.getTrackFormat(int track)方法中初始化MediaFormat,所以我使用 MediaFormat mf = MediaFormat.createAudioFormat (“audio/mp4a-latm”, getSampleRate(), getChannelCount()); 因为我所有的AAC样本都包含了ADTS mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1); 阅读完这篇文章后,我终于使用“csd-0”键添加了ESDS帧 mediaFormat.setByteBuffer(“csd-0”, ByteBuffer.allocate(2).put(new byte[]{(byte) 0x11, (byte)0x90})); 其中值0x11和0x90是从ADTS中提取的。 当我现在想要解码AAC样本时,解码器发布 AAC decoder returned error 4097, substituting silence 到日志。 为了validation我的TSExtractor正确提取样本我使用VLC记录了相同的流,将其重新转换为mp4文件而不进行转码,因此原始流不变。 现在我可以用记录的mp4文件初始化MediaExtractor,并比较我的TSExtractor和MediaExtractor创建的样本。 使用跟踪和错误我发现了一个非常奇怪的行为: 当我使用MediaExtractor创建的mediaFormat配置MediaCodec时,MediaCodec解码我的TSExtractor返回的AAC样本没有任何问题。 比较基本上包装HashMap的MediaFormat,由我的TSExtractor创建,而MediaExtractor创建的则给出了这些差异: […]

MediaMuxervideo文件大小减小(重新压缩,降低分辨率)

我正在寻找有效的方法来减少一些video权重(作为File ,上传),明显的答案是:让我们降低分辨率! (不需要全高清或4K,简单的高清对我来说已经足够了)我已经尝试了许多应该通过很多API工作的方法(需要10个),最好的方法是使用android-ffmpeg-java ,但是…我的漂亮快速几乎当前的旗舰设备整个过程持续约length_of_video * 4秒,而且这个lib重量是9 Mb,这个数量增加了我的应用程序大小…没有wai! (12 Mb到1 Mb是很好的结果,但仍然有太多的缺陷) 所以我决定使用原生Android方式来实现这一点, MediaMuxer和MediaCodec – 它们分别来自API18和API16(旧设备用户:抱歉;但他们也经常使用“低分辨率”相机)。 下面的方法几乎可以工作 – MediaMuxer不尊重MediaFormat.KEY_WIDTH和MediaFormat.KEY_HEIGHT – 提取的File是“重新压缩”,权重稍微小一点,但分辨率与原始videoFile相同… 那么,问题:如何使用MediaMuxer和其他附带的类和方法压缩和重新调整/更改video的分辨率? public File getCompressedFile(String videoPath) throws IOException{ MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(videoPath); int trackCount = extractor.getTrackCount(); String filePath = videoPath.substring(0, videoPath.lastIndexOf(File.separator)); String[] splitByDot = videoPath.split(“\\.”); String ext=””; if(splitByDot!=null && splitByDot.length>1) ext = splitByDot[splitByDot.length-1]; String fileName […]

Android在MediaPlayer中显示video流并使用MediaCodec进行编码

问题:我有来自GoPro相机的video流,格式为.m3u8。 我需要在应用程序中显示流的内容,然后流式传输video。 对于流媒体,我有与MediaCodec和ffmpeg一起使用的库。 我应该能够流式传输MediaCodec的outputBuffer。 我可以在SurfaceView上使用MediaPlayer流式传输video,没问题。 真正的困难在于使用MediaCodec。 我可以初始化MediaCodec,获取表面并将其添加到MediaPlayer – 蒸汽播放 – 我可以听到声音。 现在的问题是: 在SurfaceView上显示流 – 或MP和MC可以使用的任何其他视图。 从Surface到SurfaceView / TextureView显示数据的最佳方法是什么? 我无法从MediaCodec获取数据。 我只需要支持5.0+设备,所以我尝试使用MediaCodec.Callback。 但我每次都会得到错误。 我还没有find错误的含义。 我可以做些什么来配合Callback工作? 是否有任何“简单”的方法,或者我必须深入到缓冲区和表面,如谷歌Grafika? 以下是我得到的错误: E/ACodec﹕ [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -2147483648 1877-1904/com.example.marek.goprorecorder E/ACodec﹕ [OMX.qcom.video.encoder.avc] ERROR(0x80001009) 07-15 15:54:47.411 1877-1904/com.example.marek.goprorecorder E/ACodec﹕ signalError(omxError 0x80001009, internalError -2147483648) 07-15 15:54:47.411 1877-1903/com.example.marek.goprorecorder E/MediaCodec﹕ Codec reported err 0x80001009, actionCode 0, […]

在Android上解码h264 ByteStream总是从dequeueOutputBuffer()获取INFO_TRY_AGAIN_LATER

尝试使用媒体编解码器解码编码数据克数据包,但在dequeueOutputBuffer()中始终获得-1。 请帮帮我 – 我做错了什么? 我试图面对这个问题几天没有成功。 private void decodeVideo(){ new Thread(new Runnable() { @Override public void run() { int n = 0; MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setString(MediaFormat.KEY_MIME, “video/avc”); mediaFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 100000); mediaFormat.setInteger(MediaFormat.KEY_WIDTH, surfaceView.getWidth()); mediaFormat.setInteger(MediaFormat.KEY_HEIGHT, surfaceView.getHeight()); mediaFormat.setInteger( MediaFormat.KEY_PUSH_BLANK_BUFFERS_ON_STOP, 1); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatL2);// TODO byte[] csd_info = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, […]

Android App希望访问“/ Data”文件夹

我想将AAC编码的音频数据从我的Raspberry流式传输到我的Android手机。 接收数据的部分运行良好,但解码时存在一些问题。 我使用Media Extractor和Media Codec来解码音频数据。 这是代码的重要部分: MediaExtractor extractor = new MediaExtractor(); Uri path = Uri.fromFile(file); extractor.setDataSource(path.toString()); format = extractor.getTrackFormat(0); String mime = format.getString(MediaFormat.KEY_MIME); decoder = MediaCodec.createDecoderByType(mime); decoder.configure(format, null, null, 0); while (!stopTrack) { multicastSocket.receive(packet); decoder.start(); data = packet.getData(); inputBuffers = decoder.getInputBuffers(); outputBuffers = decoder.getOutputBuffers(); inputBufferIndex = decoder.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { inputBuffer = inputBuffers[inputBufferIndex]; […]

RTMP自适应比特率算法

我在网上搜索但是关于这个的信息非常少。 我有一个实时广播应用程序,我通过RTMP堆栈使用Android MediaCodec SDK发送编码的H264video帧和由摄像头和麦克风产生的AAC音频块。 我的直播流是720p,我的目标是2500Kbps的高质量。 这显然需要非常好的网络连接,如果您使用数据计划,则意味着4G。 问题是即使连接最大,也会出现低峰值和拥塞,因此网络将无法容纳如此繁重的流量。 因为我想提供高可靠性,我想在我的应用程序中包含自动自适应比特率,以便降低图像质量或有利于可靠性。 问题是 – 如何实现这种自动适应网络条件而不丢失帧? 它甚至可能吗? 我使用像Cerevo这样的专业编码设备,他们不会丢帧 – 但是对于我的应用程序,由于p帧在网络中丢失,我总是会受到一些可怕的拖累。 这就是我目前所拥有的: private long adaptBitrate(long idleNanos, Frame frame) { int bytes = frame.getSize(); long nowNanos = System.nanoTime(); if (nowNanos – mLastNanos > 1000L * 1000 * 1000) { double idle = (double) idleNanos / (double) (nowNanos – mLastNanos); float actualBitrate = […]

使用camera2编码的video在nexus(5x,6p)设备上是颠倒的

我们使用camera2 API使用mediacodec同时预览和编码video。 我们知道何时应该通过查询’CameraCharacteristics.SENSOR_ORIENTATION’来旋转相机,但只有预览旋转选项。 我们需要的是旋转到编码器的表面,这样我们就不会将video颠倒过来。 (或像旧相机API一样旋转相机本身。) 谢谢

Android编码和发送的video无法在iOS Telegram中播放

电报使用MeidaCodec对来自Android API 16的video进行编码。它可以在API 18中正常工作。但是API 16,17中存在错误。从Android编码和发送的video无法在iOS中播放。 我认为问题在于在解码器编解码器的输出和编码器编解码器的输入之间转换颜色。 https://github.com/DrKLO/Telegram/blob/2114024ab1d9cf209916bcdb3a4a7d44e51a3b0c/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java#L3223 我的应用程序目前使用ffmpeg对video进行编码。 但它太慢了。 MediaCodec比ffmpeg快得多。 但它只适用于API 18。 任何人都可以解决问题video无法在iOS中播放吗? 谢谢。

Android MediaCodec和摄像头:如何实现更高的帧速率从相机获取帧原始数据?

bigflake.com中的CameraToMpegTest.java或Grafika中的“Show + capture camera”的示例使用camera.preview来获取帧数据。 实验表明(Nexus 4,Android 4.4.2)的帧速率为10 fps。 这没有预期的那么高。 如果我们使用相同的设备(Nexus 4,Android 4.4.2)使用相机录制video,则帧速率为30fps。 因此我假设使用camera.preview的较低帧速率位于方法(预览方法)中。 我曾经读过一篇post,说相机预览方法的帧速率较低。 所以似乎解决方法是直接使用来自相机硬件的原始帧数据。 怎么做? 我有一个印象iOS有video处理API来做到这一点,直接从相机获取帧原始数据。 (但我不知道他们的帧速率是多少)。