致力于实现mediamuxer类.它需要来自mediacodec类的输入(一个音频和一个视频).但尝试编码"video/mp4"时抛出错误
码:
String mime = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension("mp4");
codec = MediaCodec.createEncoderByType(mime);
Run Code Online (Sandbox Code Playgroud)
错误:
Unable to instantiate a decoder for type 'video/mp4'
Run Code Online (Sandbox Code Playgroud)
注意错误是针对解码器的,并且调用是创建编码器.
我可能会在一分钟内解决这个问题,但是对于碰到这个问题的其他人来说,它会在这里.
我正在尝试编码
音频数据:
对某些AAC来说 MediaCodec
编解码器配置有点令人困惑,但到目前为止,我至少做了如下操作,至少没有错误.
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 1*44100*16);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)
这是我的猜测所以如果你发现它错了请告诉我.
KEY_CHANNEL_COUNT= 1对应于音频源属性:Monoral Channel = 1,
KEY_SAMPLE_RATE= 44100到音频源属性:Sample rate = 44100 Hz,
并且由于音频源属性是PCM_16BIT,KEY_BIT_RATE应该是 1*44100*16.
我对么?我试图找到文档,但在网上找不到.谢谢.
我能够解码mp4视频。如果我使用来配置解码器,则Surface可以在屏幕上看到视频。现在,我要编辑帧(添加黄线甚至更好地重叠小图像)并将视频编码为新视频。不必显示视频,现在我也不在乎性能。(如果在编辑时显示帧,如果编辑功能花费很多时间,我可能会有空隙),那么,您对此有何建议?我是使用GlSurface来配置解码器并使用OpenGl(GLES),还是将其配置为null并以某种方式将其转换Bytebuffer为a Bitmap,对其进行修改,然后将位图编码为字节数组?另外我在Grafika页面中看到,您可以将a Surface与自定义Rederer一起使用并使用OpenGl(GLES)。谢谢
我正在开发将视频转换为另一视频并为每个帧添加其他效果的功能。我决定使用opengl-es在每个帧上应用效果。我的输入和输出视频是使用H.264编解码器的MP4。我使用MediaCodec API(Android API 18+)将H.264解码为opengl纹理,然后使用此纹理与着色器在表面上绘制。我认为将MediaCodec与H.264结合使用会在android上进行硬件解码,并且速度很快。但似乎并非如此。重新录制432x240较小的15秒视频消耗了总时间的28秒!
请查看我的代码和个人资料信息,并分享一些建议,如果我做错了事,请提出批评。
我的代码:
private void editVideoFile()
{
if (VERBOSE)
{
Log.d(TAG, "editVideoFile " + mWidth + "x" + mHeight);
}
MediaCodec decoder = null;
MediaCodec encoder = null;
InputSurface inputSurface = null;
OutputSurface outputSurface = null;
try
{
File inputFile = new File(FILES_DIR, INPUT_FILE); // must be an absolute path
// The MediaExtractor error messages aren't very useful. Check to see if the input
// file exists so we can throw a better one if it's not …Run Code Online (Sandbox Code Playgroud)