Articles of mediacodec

我想将Pre-Rolls附加到Android设备上拍摄的video中

我正在使用mp4parser,video需要是同一种类。 我正在考虑使用Android的媒体编解码器来解码和编码预卷video以适应相机的相同编码输出(正面和背面)任何关于如何做到这一点的建议(如何获得特定的设备编码参数)?

使用MediaCodec记录曲面

因此,在我的应用程序中,我能够使用GPUImage库向来自Camera的video显示效果(如模糊滤镜,高斯)。 基本上,I(库)将从Camera获取输入,获取原始字节数据,从YUV格式将其转换为RGBA格式,然后将效果应用于此图像并使用OpenGL在GLSurfaceView的Surface上显示。 最后,对于用户来说,它看起来像是应用了效果的video。 现在我想使用MediaCodec API将Surface的帧记录为video。 但是这个讨论说我们无法将预定义的Surface传递给MediaCodec 。 我在bigflake上看到了一些使用MediaCodec.createInputSurface()创建Surface样本,但对我来说, Surface来自GLSurfaceView 。 那么,如何将Surface的帧记录为video? 我将并行录制音频,使用FFMPEG合并该video和音频,并作为应用效果的video呈现给用户。

MediaCodec.dequeInputBuffer / dequeOutputBuffer中的IllegalStateException

我正在尝试将PNG文件转换为单片video片段,以便在项目中启动。 我有什么代码可以实现它: – private boolean MediaConversion() { MediaCodec codec = MediaCodec.createEncoderByType(MIMETYPE); MediaFormat mediaFormat = null; if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)){ mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 1280 , 720); } else { mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 720, 480); } mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 700000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 10); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); codec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); codec.start(); ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers(); boolean sawInputEOS = […]

无法兼容音频和video

我正在编写一个使用MediaCodec记录屏幕捕获和音频的应用程序。 我使用MediaMuxer来复用video和音频来创建mp4文件。 我成功地分别编写了video和音频,但是当我尝试将它们混合在一起时,结果出乎意料。 音频播放时没有video,或video播放后立即播放。 我的猜测是我对时间戳做错了,但我无法弄清楚到底是什么。 我已经看过这些例子: https : //github.com/OnlyInAmerica/HWEncoderExperiments/tree/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments和bigflake.com上的那些并且无法find回答。 这是我的媒体格式配置: mVideoFormat = createMediaFormat(); private static MediaFormat createVideoFormat() { MediaFormat format = MediaFormat.createVideoFormat( Preferences.MIME_TYPE, mScreenWidth, mScreenHeight); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); format.setInteger(MediaFormat.KEY_BIT_RATE, Preferences.BIT_RATE); format.setInteger(MediaFormat.KEY_FRAME_RATE, Preferences.FRAME_RATE); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, Preferences.IFRAME_INTERVAL); return format; } mAudioFormat = createAudioFormat(); private static MediaFormat createAudioFormat() { MediaFormat format = new MediaFormat(); format.setString(MediaFormat.KEY_MIME, “audio/mp4a-latm”); format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); […]

MediaExtractor,带有原始/资产文件的MediaMetadataRetriever

我尝试在raw / assets文件夹中读取video文件,我尝试了以下方法,但没有一个工作。 我正在测试API 16.每种方法,我尝试使用和不使用mp4扩展。 我真的很感激有人可以帮助我 所有方法都不会崩溃, MediaMetadataRetriever可以设置数据源,但无法获取宽度,高度和截图。 VideoExtractor总是返回 06-04 16:44:10.519: E/FileSource(8695): Failed to open file FILE_PATH. (No such file or directory) 06-04 16:44:10.519: E/DecodeActivity(8695): Can’t find video info! 方法1:android.resource String filePath = “android.resource://” + this.activity.getPackageName() + “/raw/green_backhand_slice”; videoExtractor.setDataSource(activity.getApplicationContext(), Uri.parse(filePath), null); metaRetriever.setDataSource(act.getApplication(), Uri.parse(filePath)); 方法2:android_asset this.filePath = “file:///android_asset/green_backhand_slice”; videoExtractor.setDataSource(activity.getApplicationContext(), Uri.parse(this.filePath), null); metaRetriever.setDataSource(act.getApplication(), Uri.parse(filePath)); 方法3:资产文件描述符 AssetFileDescriptor assetFD […]

MediaCodec H264编码器无法在Snapdragon 800设备上运行

我使用Android的MediaCodec API编写了H264流编码器。 我使用不同的处理器在大约十种不同的设备上进行了测试,除了Snapdragon 800驱动的设备(谷歌Nexus 5和索尼Xperia Z1)之外,它在所有设备上都有效。 在那些设备上,我得到了SPS和PPS以及第一个Keyframe,但之后mEncoder.dequeueOutputBuffer(mBufferInfo,0)只返回MediaCodec.INFO_TRY_AGAIN_LATER。 我已经尝试过不同的超时,比特率,分辨率和其他配置选项,但无济于事。 结果总是一样的。 我使用以下代码初始化编码器: mBufferInfo = new MediaCodec.BufferInfo(); encoder = MediaCodec.createEncoderByType(“video/avc”); MediaFormat mediaFormat = MediaFormat.createVideoFormat(“video/avc”, 640, 480); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 768000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, mEncoderColorFormat); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10); encoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 所选颜色格式为: MediaCodecInfo.CodecCapabilities capabilities = mCodecInfo.getCapabilitiesForType(MIME_TYPE); for (int i = 0; i < capabilities.colorFormats.length && selectedColorFormat == 0; i++) { int […]

Android MediaCodec:减少mp4video大小

我正在寻找一种“压缩”mp4video的方法。 为此,我想降低video的分辨率和/或降低FPS。 经过长时间的研究,我认为这样做的方法是使用MediaCodec和相关的API,如下所示: – > MediaExtractor从mp4文件中提取编码的媒体数据。 – > MediaCodec(解码器):解码每个帧以供以后处理。 – > MediaCodec(编码器):此时,我猜我们应该在哪里建立MediaFormat参数,例如video分辨率,这应该有助于我们减少mp4文件的最终大小。 – > MediaMuxer用于生成mp4文件(MinSDK 18,这可能是一个问题,但现在……好的)。 我不想使用SurfaceView / TextureView。 关于音频,我不想处理它以降低质量。 我一直在看这里的所有例子: http : //bigflake.com/mediacodec/ 我也看过CTS源代码模块。 我一直在研究以下几个项目: https : //github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java 当然,我已经在stackoverflow上阅读了几十篇post。 问题是我还没有find任何适合这个porpuse的代码示例。 我尝试将各种代码片段放在一起放在一个项目中,但实际上并没有用。 谢谢。

在Android上使用AudioRecord和MediaCodec编码AAC音频

我正在尝试使用Android AudioRecord和MediaCodec对aac音频进行编码。 我创建了一个非常类似的编码器类( 使用Android MediaCodec从相机编码H.264 )。 在这个类中,我创建了一个AudioRecord实例,并告诉它将其byte []数据读出到AudioEncoder(audioEncoder.offerEncoder(Data))。 while(isRecording) { audioRecord.read(Data, 0, Data.length); audioEncoder.offerEncoder(Data); } 这是我的AudioRecord设置 int audioSource = MediaRecorder.AudioSource.MIC; int sampleRateInHz = 44100; int channelConfig = AudioFormat.CHANNEL_IN_MONO; int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 我成功收集了一些byte []数组数据并将其写入本地文件。 不幸的是,该文件无法播放。 我做了一些在线搜索,发现了一个相关的post( 如何使用Android MediaCodec生成AAC ADTS基本流 )。 因此,遇到类似问题的其他人说主要问题是“MediaCodec编码器生成原始AAC流。原始AAC流需要转换为可播放格式,例如ADTS流”。 所以我尝试添加ADTS标头。 不过,在我添加了ADTS标头后(我在下面的代码中注释掉了),我的AudioEncoder甚至都不会写输出音频文件。 有什么我想念的吗? 我的设置是否正确? 欢迎任何建议,意见和意见,非常感谢。 多谢你们! import android.media.MediaCodec; […]

使用Android的MediaCodec和MediaMuxer复用AAC音频

我正在修改一个Android Framework示例 ,将MediaCodec生成的基本AAC流打包成一个独立的.mp4文件。 我正在使用一个MediaMuxer实例,其中包含一个由MediaCodec实例生成的AAC轨道。 但是,在调用mMediaMuxer.writeSampleData(trackIndex, encodedData, bufferInfo)我总是最终收到错误消息: E/MPEG4Writer﹕timestampUs 0 < lastTimestampUs XXXXX for Audio track 当我在mCodec.queueInputBuffer(…)对原始输入数据进行mCodec.queueInputBuffer(…)我提供0作为每个框架示例的时间戳值(我也尝试使用具有相同结果的单调增加的时间戳值。我已成功编码原始相机使用相同的方法将帧转换为h264 / mp4文件)。 查看完整的来源 最相关的片段: private static void testEncoder(String componentName, MediaFormat format, Context c) { int trackIndex = 0; boolean mMuxerStarted = false; File f = FileUtils.createTempFileInRootAppStorage(c, “aac_test_” + new Date().getTime() + “.mp4”); MediaCodec codec = MediaCodec.createByCodecName(componentName); try { codec.configure( […]

如何使用MediaCodec Android压缩mp4video?

在我的Android应用程序中,我想通过更改其分辨率,比特率来压缩mp4video。 我不想使用FFmpeg(因为我不想使用NDK),所以我决定使用MediaCodec API。 以下是我的逻辑步骤: 使用MediaExtractor提取video文件,然后解码数据。 使用我的新分辨率,比特率和编码数据创建新的编码器。 使用MediaMuxer创建新的mp4文件。 我的问题是:我不知道如何设置解码器输出和编码器输入之间的连接。 我可以将video解码为Surface或从曲面编码新video。 但我不明白如何连接它们。 我读了这些链接: Android MediaCodec: 使用新的MediaCodec库和Bigflake的示例减少mp4video大小 , Android上的video压缩 : https ://android.googlesource.com/platform/cts/+/jb-mr2-release/tests /tests/media/src/android/media/cts/DecodeEditEncodeTest.java 任何人都可以给我一个明确的解释我必须做什么吗?