我正在编写一个使用MediaCodec记录屏幕捕获和音频的应用程序.我使用MediaMuxer来混合视频和音频来创建mp4文件.我成功地分别编写了视频和音频,但是当我尝试将它们混合在一起时,结果出乎意料.音频播放时没有视频,或视频播放后立即播放.我的猜测是我在时间戳上做错了,但我无法弄清楚到底是什么.我已经看过这些例子:https://github.com/OnlyInAmerica/HWEncoderExperiments/tree/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments和bigflake.com上的那些并且无法找到回答.
这是我的媒体格式配置:
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);
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64000);
return format;
}
Run Code Online (Sandbox Code Playgroud)
音频和视频编码器,复用器:
mVideoEncoder = MediaCodec.createEncoderByType(Preferences.MIME_TYPE);
mVideoEncoder.configure(mVideoFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
mInputSurface = new InputSurface(mVideoEncoder.createInputSurface(),
mSavedEglContext);
mVideoEncoder.start();
if (recordAudio){
audioBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
mAudioRecorder …Run Code Online (Sandbox Code Playgroud) 我在MediaCodec.configure()行上得到了IllegalStateException,我正在尝试使用MediaCodec录制音频.这只发生在某些手机上,标签上的一切都很好.这个特殊的崩溃示例来自三星Galaxy S4.异常痕迹:
01-22 17:33:38.379: V/ACodec(16541): [OMX.google.aac.decoder] Now Loaded
01-22 17:33:38.379: V/ACodec(16541): onConfigureComponent
01-22 17:33:38.379: W/ACodec(16541): [OMX.google.aac.decoder] Failed to set standard component role 'audio_encoder.aac'.
01-22 17:33:38.379: E/ACodec(16541): [OMX.google.aac.decoder] configureCodec returning error -2147483648
01-22 17:33:38.379: E/MediaCodec(16541): Codec reported an error. (omx error 0x80001001, internalError -2147483648)
01-22 17:33:38.384: D/AndroidRuntime(16541): Shutting down VM
01-22 17:33:38.384: W/dalvikvm(16541): threadid=1: thread exiting with uncaught exception (group=0x418d0700)
01-22 17:33:38.414: W/BugSenseHandler(16541): Transmitting crash Exception Unable to resolve host "bugsense.appspot.com": No address associated with hostname
01-22 17:33:41.404: E/AndroidRuntime(16541): FATAL EXCEPTION: …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的应用程序实现暂停/恢复功能,该功能使用MediaCodec记录显示捕获.我已经尝试过mEncoder.stop()然后调用mEncoder.start()而不调用mEncoder.release()但是没有用.再次调用mEncoder.start()时,我得到IllegalStateException.现在我实施了一个解决方法,我在捕获完成后合并视频的和平,但合并需要很长时间.任何人都可以帮助我吗?也许有人已经实现了这个东西?
Initialazation:
MediaCodec mEncoder;
mEncoder = MediaCodec.createEncoderByType(Preferences.MIME_TYPE);
mEncoder.configure(mFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
mInputSurface = new InputSurface(mEncoder.createInputSurface(),
mSavedEglContext);
mEncoder.start();
try {
String fileId = String.valueOf(System.currentTimeMillis());
mMuxer = new MediaMuxer(dir.getPath() + "/Video"
+ fileId + ".mp4",
MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
videoParts.add(fileId);
} catch (IOException ioe) {
throw new RuntimeException("MediaMuxer creation failed", ioe);
}
isRecording = true;
Run Code Online (Sandbox Code Playgroud)
暂停:
public void pauseRecordPressed() {
if (isRecording){
isRecording = false;
drainEncoder(false);
if (mEncoder != null) {
mEncoder.stop();
}
}
}
Run Code Online (Sandbox Code Playgroud)
取消暂停:
public void resumeRecordPressed() {
mEncoder.start();
isRecording = true;
} …Run Code Online (Sandbox Code Playgroud)