MediaCodec同时进行编码和解码
我正在尝试使用 GPU 将效果应用于视频的帧,然后将这些帧重新编码为新的结果视频. 为了提高性能,我实施了以下流程: 有 3 个不同的线程,每个线程都有自己的 OpenGL 上下文.这些上下文的设置方式使得它们在它们之间共享纹理. 线程 1 从视频中提取帧并将它们作为纹理保存在 GPU 内存中,类似于 这个例子. 线程 2 使用 GPUImage 的修改版本处理纹理,该 GPUImage 还在 GPU 内存中输出纹理. 最后,线程 3 将从线程 2 获得的纹理写入一个新的视频文件,类似于 这里 使用线程 1 和 2 以及线程 2 和 3 之间的队列维护帧顺序.纹理在用于处理/写入之后从内存中手动删除. 这个流程的重点是分离每个进程,希望最终的性能是 3 个线程中最慢的. 问题: 最终的视频有 90% 的黑帧,只有一部分是正确的. 我检查了提取和处理的各个结果,它们按预期工作.另请注意,3 个线程中描述的 3 个组件在一个线程中可
494 2022-07-28
编程技术问答社区
用Android的MediaCodec和MediaMuxer混合AAC音频
我正在修改 Android 框架示例 将 MediaCodec 生成的基本 AAC 流打包成独立的 .mp4 文件.我正在使用单个 MediaMuxer 实例,其中包含一个由 MediaCodec 实例生成的 AAC 轨道. 但是,我最终总是在调用 mMediaMuxer.writeSampleData(trackIndex, encodedData, bufferInfo) 时收到一条错误消息: E/MPEG4Writer﹕timestampUs 0
260 2022-07-28
编程技术问答社区
MediaMuxer视频压缩(改变分辨率)
我正在寻找压缩一些视频(作为File)的有效方法,首先:让我们降低分辨率!我已经尝试了很多方式,应该通过大量的API(需要10),最好的方法是使用 android-ffmpeg-java ,但是......在我的相当快的差异旗舰设备整个过程持续时间持续_ of_video * 4秒,而且这个lib重量是9 mb,这个量增加了我的应用尺寸......没有w! (12 MB到1 MB是不错的结果,但缺乏太多缺陷) 所以我决定使用原生Android方法来做这件事,MediaMuxer和MediaCodec - 它们可以从API18和API16获得(旧设备用户:抱歉).下面的方法几乎工作 - MediaMuxer不尊重MediaFormat.KEY_WIDTH和MediaFormat.KEY_HEIGHT - 提取的File是"重新压缩",权重有点较小,但分辨率相同原始视频File ... 所以,问题:如何使用MediaMuxer和其他附带类和方法压缩和重新缩放视频分辨率? p
1026 2022-07-19
编程技术问答社区
安卓MediaCodec解码器的输入/输出帧数
我正在Android中进行视频转码,并使用标准方法作为这些示例来提取/解码视频.我用不同的视频设备在不同的设备上测试了相同的过程,发现解码器输入/输出的帧数有问题. 对于 this question 中的一些时间码问题,我使用队列记录提取的视频样本,并在得到解码器帧输出时检查队列,如以下代码:(为了更清楚,我省略了编码相关的代码) Queue sample_time_queue = new LinkedList(); .... // in transcoding loop if (is_decode_input_done == false) { int decode_input_index = decoder.dequeueInputBuffer(TIMEOUT_USEC); if (decode_input_index >= 0) { ByteBuffer decoder_input_buffer = dec
606 2022-07-19
编程技术问答社区
安卓系统中由MediaCodec编码的H.264 avc视频无法播放
背景: 两天来,我一直致力于实现类似 Vine 的录像机.首先,我尝试了 MediaRecorder.但是我需要的视频可能是由小视频片段组成的.此类不能用于录制短时视频剪辑.然后我找到了 MediaCodec、FFmpeg 和 JavaCV.FFmpeg 和 JavaCV 可以解决这个问题.但我必须用许多库文件编译我的项目.它将生成一个非常大的 APK 文件.所以我更喜欢用MediaCodec来实现,虽然这个类只能在Android 4.1之后使用.90% 的用户会感到满意. 结果: 我终于得到了编码文件,但无法播放.我通过FFprobe查看了信息,结果是这样的: 输入 #0,h264,来自“test.mp4":持续时间:不适用,比特率:不适用流 #0:0:视频:h264(基线)、yuv420p、640x480、25 fps、25 tbr、1200k tbn、50 tbc 我对H.264编码的机制了解不多. 代码: 从此链接修改 public c
714 2022-07-19
编程技术问答社区
安卓。编码的相机预览帧总是处于横向。如何旋转?
目标:无论设备方向(即视频总是正确的) 我看了关于相机方向的所有问题,到目前为止他们似乎只是改变了呈现给屏幕的预览,或者在MP4文件中设置标志(不适合我的用例:流式传输). 我将相机帧流媒体到Wowza服务器,并在Wowza Server上接收的视频始终是景观.如果手机始终以相同的方向保持,则这很好,但我无法保证我的用户会这样做.从我收集的内容,当你直接从相机抓住框架并将它们馈送到编码器时,您可以获得设备相机的自然定向(可能在我的情况下安装景观),这完全不受预览的影响.这是有问题的,因为如果设备在流期间旋转,则图像会随它旋转. 我已经尝试使用OpenGL矩阵在自定义GlsurfaceView.Renderer中转换预览,并且所有它确实在屏幕上转换了视图,而不是发送到编码器的帧. 我已经读过grafika的例子,我不确定在进入帧之前的过程中,在它们被馈送到编码器之前.我使用surfacetexture作为相机预览,然后将其呈现为glsurfaceview(并使用我自己的
420 2022-07-19
编程技术问答社区
如何检测安卓设备中的芯片组?
我需要检测安卓设备的芯片组.所以我可以禁用 MediaTek 芯片组上的某些功能.(本问题中讨论的 1080p 编码 MediaCodec 编码的视频底部有绿色条,色度搞砸了) 我看过 http://developer.android.com/参考/android/os/Build.html,但似乎没有什么相关的. 解决方案 除了Android API,还可以通过proc调用cpuinfo来获取CPU名信息(比如mediatek,mt6589).这方面的一个例子是 如何从“/proc/cpuinfo"获取Android设备的具体信息飞吗? .但特定的 SOC 相关错误需要 SOC 级别识别,因为未来的修订可能会删除错误但保留相同的名称/部件号.
262 2022-07-19
编程技术问答社区
如何使用MediaCodec编码器获得RGB颜色格式的帧
我使用以下代码使用Android的MediaCodec API创建了编码器: MediaFormat mMediaFormat = MediaFormat.createVideoFormat("video/avc", width, height); mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15); mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); mMediaFormat.setInteger(MediaFormat.KEY_I_FR
2372 2022-07-19
编程技术问答社区
使用AndroidBreakout获得不可流转的错误
我一直在探索 http://bigflake.com/mediacodec/ by Fadden,并应用补丁 http://bigflake.com/mediacodec/0001-record-game-into-.mp4.patch 到突破游戏.不幸的是,在编译代码之后,我意识到它不起作用,产生不流动的视频文件. 我看到以下错误: "mp4文件不会流." 根据Fadden,这应该通过检查mbufferinfo.flags( 解决方案 警告你看到的只是一个警告,没有更多.在大多数情况下,MP4文件无论如何都无法流动,从此感觉到您可以通过管道通过写入的MP4并让另一端播放它(除非您求助于大量额外的诡计,或使用碎片MP4哪个Android MP4 Muxer不正常写入).这里有什么可流动的手段是,一旦您拥有最终的MP4文件,就可以开始播放,而无需寻找文件的末尾(通过HTTP播放即可执行equace. 要编写流的MP4,Muxer试图猜测您的文件将有多大,并在文件开始时保
308 2022-07-19
编程技术问答社区
使用Intel media-for-mobile样本的视频剪辑/修剪崩溃了
我正在使用英特尔媒体for-mobile样本( https://github.com/indexos/Media-Mobile )修剪/剪辑视频.但是,当我尝试视频修剪时,单击"开始"按钮,它给了我一个错误: java.lang.IllegalStateException 使用logcat红色错误为: 名称'omx.qcom.audio.decoder.aac'的一个组成部分已存在,忽略此. [OMX.qcom.video.decoder.avc] configureCodec returning error -1010 编解码器报告了错误. (omx error 0x80001001, internalError -1010) 可以帮助我摆脱这个问题.我在这个问题上度过了两天,但无法弄清楚. 解决方案 此处继续讨论: INDE M4M不支持输入MPEG-4视频.需要使用h.264
406 2022-07-19
编程技术问答社区
使用MediaCodec API在基于Android的媒体播放器应用程序中实现音频视频同步的最佳方式是什么?
我正在尝试使用MediaCodec api来在Android中实现媒体播放器. 我已经创建了三个线程 线程1:将输入缓冲区除去以获取自由索引,然后在相应的Codec的输入缓冲区中排队audio和video帧. 线程2:要将audio编解码器的输出缓冲区取消队列,并使用AudioTrack类'写法 渲染它 线程3:将video编解码器的输出缓冲区除去,并使用releaseBuffer方法渲染它 在实现audio和video帧之间的同步时,我面临着大量问题.我从不丢弃audio帧,然后在渲染之前删除video帧,我检查解码的帧是否迟到超过3摩尔,如果它们是我的框架,如果它们早期超过10ms,我不会呈现框架. 找到audio和video的差异我使用后面的逻辑 public long calculateLateByUs(long timeUs) { long nowUs = 0; if (hasAudio && audioTrack
1590 2022-07-19
编程技术问答社区
在没有MediaExtractor的情况下使用MediaCodec解码mp4/h.264,预期访问单元格式
我正在尝试使用MediaCodec API进行解码,而无需使用MediaExtractor API.相反,我使用MP4Parser从MP4文件获取样本.目前,我只使用H.264/AVC编码的视频内容. 缓冲区未启动和结束任意字节边界,这不是字节流,它是一个访问单元流. 意思,我必须向解码器提供访问单元.但是,我错过了以下信息中的一些细节: 对于H.264,在MP4样本中,可以有多个nal单位,每个NAL单位在4(默认)字节之前,指定NAL单位长度. 现在我的问题: 可以有MP4样本,其中Codec Config Nal单元(SPS,PPS)与包含编码(部分)帧的NAL单元混合.在这种情况下,我应该在queueInputBuffers()的呼叫中传递标志BUFFER_FLAG_CODEC_CONFIG吗? 在MP4样本中也可以存在其他(附加)NAL单元,如SEI或Access单元分隔符NAL单元.那些人怎么样?没问题? 我尝试了不同的各种可能性,但
642 2022-07-19
编程技术问答社区
暂停/恢复MediaCodec
我正在尝试为使用MediaCodec记录显示捕获的应用程序的暂停/恢复功能. 我尝试过mencoder.stop(),然后尝试了mencoder.start()而不调用mencoder.release(),但这不起作用.再次调用Mencoder.Start()时,我会得到IllegalStateException. 现在我实施了一个解决方法,我在捕获完成后,我合并了视频的发布,但它需要很长时间才能合并. 任何人都可以帮助我吗?也许有人已经实施了这件事? 初始化: MediaCodec mEncoder; mEncoder = MediaCodec.createEncoderByType(Preferences.MIME_TYPE); mEncoder.configure(mFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mInputSurface = new
4182 2022-07-17
编程技术问答社区