Articles of mediacodec

解码audio文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位

我想将audio文件解码为原始PCM数据,将其stream式传输到本地networking中的播放设备。 我使用了API级别为16的新MediaExtractor和MediaCodec类。 该设备要求PCM数据在44100kHz,具有2个通道和16位样本大小 。 只要input文件大致符合这些要求,这工作正常。 但是,无论何时我正在解码一个MP3文件,例如,使用32,000 kHz的采样率,也许只有一个通道,那么我不会从MediaCodec类获得所需的输出。 看来我不能指定MediaCodec类的输出格式 。 所以我决定实例化另一个MediaCodec对象,将原始数据重新编码成我想要的格式。 根据Android 4.1 支持的媒体格式列表,Android支持编码PCM / Wave。 但是, 我无法创build一个MediaCodec对象,编码PCM / Wave 。 我试着将各种MIMEtypes传递给MediaCodec.createEncoderByType(type); 但是我总是以IOExceptionexception失败: java.io.IOException: Failed to allocate component instance at android.media.MediaCodec.native_setup(Native Method) at android.media.MediaCodec.<init>(MediaCodec.java:210) at android.media.MediaCodec.createEncoderByType(MediaCodec.java:194) [..] 有没有人能够成功地创build一个MediaCodec实例,编码为PCM / Wave,并可以提供一个工作的例子?

我无法使用adb屏幕logging工具捕捉android屏幕

我有一个与Android KitKat nexus 4。 我尝试使用以下命令进行屏幕录制: adb shell screenrecord –verbose /sdcard/demo.mp4 adb shell screenrecord –bit-rate 8000000 –time-limit 30 /sdcard/kitkat.mp4 两次,这些命令都返回了这条消息: Main display is 768×1280 @60.00fps (orientation=0) Configuring recorder for 768×1280 video at 4.00Mbps ERROR: unable to create video/avc codec instance 在AndroidStudio中打开的debugging控制台中,显示了以下日志消息: 02-02 18:16:29.058 176-4045/? E/OMX-VENC-720p﹕ Is component secure 0 02-02 18:16:29.058 176-4045/? E/OMX-VENC-720p﹕ ERROR: Omx_venc::Comp Init […]

Android相机上的预览帧率不一致

我试图通过相机的PreviewCall(onPreviewFrame)使用MediaCodec对每秒30帧的video进行编码。 我编码的video总是播放速度非常快(这是不希望的)。 所以,我试图通过设置一个int frameCountvariables来记住我的相机的预览帧数,以记住它的计数。 我期望的是每秒30帧,因为我设置我的相机的预览有30帧预览(如下所示)。 我得到的结果是不一样的。 我调用了onPreviewFramecallback10秒,我得到的frameCount的数量只有大约100帧。 这是不好的,因为我期待300帧。 我的相机参数设置是否正确? 这是Android的Camera预览callback的限制吗? 如果这是Android Camera预览callback的限制,那么是否还有其他相机callback,可以每秒30帧的速度返回相机的图像数据(nv21,yuv,yv12)? 感谢您的阅读,并花时间来帮忙。 我将不胜感激任何意见和意见。 以下是使用Camera的onPreviewFrame编码的video示例: http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewFormat(ImageFormat.NV21); parameters.setPictureSize(previewWidth,previewHeight); parameters.setPreviewSize(previewWidth, previewHeight); // parameters.setPreviewFpsRange(30000,30000); parameters.setPreviewFrameRate(30); mCamera.setParameters(parameters); mCamera.setPreviewCallback(previewCallback); mCamera.setPreviewDisplay(holder);

带声音的Androidvideo循环缓冲区

我正在使用Google的开源示例: Grafika 。 我正在使用它的ContinuousCaptureActivity.java CircularBuffer的实现演示在这个活动,但没有audio包括在最终的video文件。 我想在此活动中添加audio录制function,并将录制的audio以相同的循环缓冲方式添加到video中。 为了实现这一点,我已经探索了4.3 +版本中引入的MediaCodec库。 我也使用MediaMuxer捕捉video和audiostream,并将它们混合成一个video。 但是,我不确定如何将audio录制function实现到ContinuousCaptureActivity.java类中。 任何帮助,高度赞赏。

如何直接从Android Surface访问EGL图像以用于MediaCodecvideo解码器?

我目前正在编写一个Android应用程序,我需要cachingvideo帧,以便我可以轻松地来回拖动。 现在,我让android通过为MediaCodec对象的Configure调用提供一个Surface并将render标志设置为true来调用releaseOutputBuffer来解码video帧。 我发现访问解码表面数据的唯一方式(除了解码格式似乎依赖于设备的返回的字节缓冲区之外)是调用连接到Surface的SurfaceTexture上的updateTeximage ,将其附加到GL_TEXTURE_EXTERNAL_OES目标并将其渲染为GL_TEXTURE2D目标纹理我创build自己为了caching它。 我想优化这个caching过程,并能够解码不同线程上的帧。 使用我目前的方法,这意味着我将不得不为video解码器创build另一个EGL上下文,共享上下文等… 我的问题是: 是否有可能访问EGL图像或本地缓冲区数据与Surface关联,而无需调用 updateTexImage ? 这样我可以cachingegl图像(根据EGL_ANDROID_image_native_buffer不需要EGL上下文)。 这也将caching在YUV格式,这将比我现在caching的原始RGB纹理更有效的存储效率。

Android MediaCodec解码h264原始帧

我正在使用Android MediaCodec API来解码h264帧。 我可以解码和渲染视图上的帧。 我的问题是解码器错过了许多帧,尤其是第一个帧。 DecodeMediaCodec.dequeueOutputBuffer()返回-1。 a约150 h264帧,刚刚解码43帧。 我找不到问题所在。 这是我的代码。 /** * init decoder */ private void initDecodeMediaCodec() { mDecodeMediaCodec = MediaCodec.createDecoderByType(MIME_TYPE); MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, VIDEO_WIDTH_640, VIDEO_HEIGHT_480); mDecodeMediaCodec.configure(format, new Surface(mRemoteVideoView.getSurfaceTexture()), null, 0); mDecodeMediaCodec.start(); mDecodeInputBuffers = mDecodeMediaCodec.getInputBuffers(); System.out.println("decode—–" + mDecodeMediaCodec.getCodecInfo().getName()); } 解码器初始化后,我将启动解码器线程。 /** * * @param frameData */ private void decode() { new Thread(new Runnable() […]

native_window_api_connect返回一个错误:无效参数(-22)

我正在使用MediaCodec API编写video播放器应用程序。 video解码开始之前,我必须显示空白屏幕。 所以我使用下面的代码来显示空白屏幕。 Canvas c=null; c = surfaceView.getHolder().lockCanvas(); c.drawColor(Color.BLACK); surfaceView.getHolder().unlockCanvasAndPost(c); 此后video解码将开始。 但是在configuration的时候 videoDecoder.configure(format, surfaceView.getHolder().getSurface(), null, 0); 它给以下的错误 02-03 03:52:37.542: E/MediaCodec(9655): native_window_api_connect returned an error: Invalid argument (-22) 02-03 03:52:37.542: E/Video Decoder Configuration(9655): java.lang.IllegalStateException 所以我的应用程序崩溃与该错误。 没有那个空白的屏幕代码解码器工作正常。 我该如何解决这个问题?

Android MediaCodec在asynchronous模式下进行编码和解码

我试图解码一个文件中的video,并将其编码为与MediaCodec不同的格式,支持API Level 21及更高版本(Android OS 5.0 Lollipop)的新asynchronous模式 。 在诸如Big Flake ,Google的Grafika以及StackOverflow上的几十个答案等站点上,有许多同步模式的例子,但是它们都不支持asynchronous模式。 在这个过程中,我不需要显示video。 我相信一般的过程是用MediaExtractor读取文件作为MediaCodec (解码器)的input,允许解码器的输出渲染到也是MediaCodec (编码器)的共享input的Surface中,然后最后通过MediaMuxer编写Encoder输出文件。 Surface是在编码器设置过程中创build的,并与解码器共享。 我可以把video解码成一个TextureView ,但是用编码器而不是屏幕共享Surface还没有成功。 我为我的两个编解码器设置了MediaCodec.Callback() 。 我相信一个问题是我不知道在编码器的callback的onInputBufferAvailable()函数中onInputBufferAvailable() 。 我不知道如何(或知道如何)将数据从Surface复制到编码器中 – 这应该是自动发生的(就像在解码器输出上用codec.releaseOutputBuffer(outputBufferId, true); )所做的那样)。 然而,我相信onInputBufferAvailable需要调用codec.queueInputBuffer才能正常工作。 我只是不知道如何设置参数,而不像解码端使用的MediaExtractor那样获取数据。 如果您有一个打开video文件的示例,对其进行解码,使用asynchronousMediaCodeccallback将其编码为不同的分辨率或格式,然后将其另存为文件 ,请分享您的示例代码。 === 编辑 === 这是一个在asynchronous模式下我正在尝试做同步模式的工作示例:ExtractDecodeEditEncodeMuxTest.java: https ://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media /src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java这个例子是在我的应用程序

在Android中,如何将预定义的Surface传递给MediaCodec进行编码?

我有一个pipe理自己的GLSurfaceView的应用程序,现在我想使用Android 4.3的新的MediaCodecfunction,将Surface作为input。 在所有我见过的例子中,使用MediaCodec.createInputSurface()创buildSurface,然后为这个Surface创buildGL上下文。 这感觉是单一的,并且令人难以置信的破坏性,以改造成已经稳定的代码库。 是否可以使用MediaCodec.configure(format,a_predefined_Surface,null,MediaCodec.CONFIGURE_FLAG_ENCODE)? 这允许我以即插即用和按需的方式使用MediaCodec。 MediaCodec.configure()采用Surface参数的事实表明这应该是可能的。 但是,API指出“指定一个表面,以渲染此解码器的输出” http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat,android 。 view.Surface,android.media.MediaCrypto,int)这是否意味着这只是为了解码而不是编码 ? 如果是的话,有没有办法让MediaCodec使用预定义的Surface进行编码? 我传入的Surface已经创build,EGL_RECORDABLE_ANDROID设置为true,并且返回的GL上下文被validation为包含所需的EGL_RECORDABLE_ANDROID属性。 尽pipe如此,MediaCodec.configure()失败,并带来无用的exception“native_window_api_connect返回错误:无效参数(-22)”: I/ACodec(32383): Now uninitialized I/OMXClient(32383): Using client-side OMX mux. I/ACodec(32383): [OMX.qcom.video.encoder.avc] Now Loaded E/MediaCodec(32383): native_window_api_connect returned an error: Invalid argument (-22) W/System.err(32383): java.lang.IllegalStateException W/System.err(32383): at android.media.MediaCodec.native_configure(Native Method) W/System.err(32383): at android.media.MediaCodec.configure(MediaCodec.java:259) […] W/System.err(32383): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520) W/System.err(32383): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 这是来自Android 4.3的三星Galaxy S4。

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

我尝试读取原始/资产文件夹内的video文件,我尝试了以下方法,但没有一个工作。 我正在API 16testing。每种方法,我尝试与无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 = null; […]