我正在尝试录制MediaRecorder
而不使用Camera
实例,而是使用Surface
视频源(是的,这是可能的,但结果不是那么完美)MediaRecorder。setVideoSource(MediaRecorder.VideoSource.SURFACE)
我只是写什么问题:
下一个代码仅在某些设备上工作,在最近的设备重新启动后在某些设备上临时工作,或者根本不工作
如果不工作ok
MediaRecorder.stop()
方法失败,下一个错误
E/MediaRecorder:停止失败:-1007 W/系统。错误:
JAVAlang.RuntimeException:停止失败。在
Android媒体媒体录像机。停止(本机方法)
刻录机mp4文件太小(千字节),无法播放
测试设备:
联想P2、小米A1的作品
不适用于小米红米5,索尼Xperia,小米红米4 Prime
您还可以阅读我的代码中的注释,以便更好地理解问题
new Thread(() -> {
MediaRecorder mediaRecorder = new MediaRecorder();
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "test_media_recorder_surface_source.mp4");
if (file.exists()) {
file.delete();
}
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setCaptureRate(24);
try {
mediaRecorder.prepare();
int sleepTime = 1000 / 24;
Surface surface = mediaRecorder.getSurface();
mediaRecorder.start();
// record something (we can also record frames here from onPreviewFrame byte arrays)
// e.g. convert raw frame byte[] to Bitmap using mb OpenCV and then draw bitmap on canvas
// using canvas.drawBitmap(...)
// here we record just blue background...
for (int i = 0; i < 120; i++) { // 5 seconds, 24 fps
Canvas canvas = surface.lockCanvas(null);
canvas.drawColor(Color.BLUE);
surface.unlockCanvasAndPost(canvas);
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// on many devices stop fails with RuntimeException -1007 error code
// I guess it works ok 100% only for modern powerful devices...
mediaRecorder.stop();
// E/MediaRecorder: stop failed: -1007
// W/System.err: java.lang.RuntimeException: stop failed.
// at android.media.MediaRecorder.stop(Native Method)
// recorder.reset();
mediaRecorder.release();
// I get file with very small size (kilobytes) and it can't be played
// ######## RESULTS ######
// WORKS OK ON:
// - Lenovo P2 (Android 7)
// - Xiaomi Mi A1 (Android 8)
// DOESN'T WORK ON (stop fails with -1007, small video file and can't be played):
// - Xiaomi Redmi 5 (Android 7)
// - Sony Xperia (I don't remember the exact model and Android OS)
// - Xiaomi Redmi 4 Prime (Android 6) *
// * p.s. on Xiaomi Redmi 4 Prime it works some time after rebooting the device
// if I leave this smartphone for a while and try again it will fail again
// until I reboot the device...
} catch (Exception e) {
e.printStackTrace();
}
}).start();
更新#1似乎取得了一些进展可能是什么问题-代码问题(mp4/h264)
它与WEBM/VP8工作得更好,视频现在可以播放,但fps有问题,它显示1000的比例
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.WEBM);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.VP8);
此外,MediaRecord在使用时不录制音频
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.VORBIS);
检查Android MediaRecorder在使用MP4/H264和大于720p的分辨率时在停止时崩溃,因此在使用
MediaRecorder
和MediaProjection
录制/捕获设备屏幕时也会发生这种情况(因为它也使用Surface
…)
更新2是似乎vp8编解码器工作正常,但一个问题为webm容器-没有音频!
有缺陷的Android不支持VORBIS/OGG音频编码。。。https://developer.android.com/guide/topics/media/media-formats#audio-格式
我想没有解决办法
所以答案是:MediaRecorder/Android有缺陷,或者移动公司在开发设备时不关心Android的所有功能
最新消息
MediaCodec
在canvas上也有缺陷
mSurface = mMediaCodec.createInputSurface();
mSurface.lockHardwareCanvas()
它可以在更多使用MediaCodec的设备上工作,但仍有一些设备可能无法使用此方法正确录制视频
所以最后的答案是:不要使用lockCanvas
或lockHardware Canvas
,当使用MediaCodec
或MediaRecorder
时,它是错误的...
唯一的方法-OpenGl ES
关于问题的其他链接:
https://github.com/googlesamples/android-Camera2Video/issues/86 https://issuetracker.google.com/issues/111433520
我正在工作的视频录制应用程序,在其中我想显示预览,当用户点击记录按钮,它开始录制,当用户点击停止按钮,它停止录制。 我有视频预览在我的表面,但当我按下开始按钮,它崩溃的错误“Media.Recorder.start(本机方法)。这是我的代码,请帮助我的家伙。
我有问题与媒体录音机在Android。我正在录制一个音频,它与LG P500很好地工作,但同样的代码在三星GT-S5360上不工作。我得到了错误,因为启动失败-22。 这是我正在使用的代码: 当调试时,在logcat中case为null。 请给我一些解决办法。
我试着用媒体记录器在android中录制一段视频。当我试着用2.3.4版本的媒体记录器录制视频时,它在4.0及更高的版本下工作得很好,给出了启动失败异常-12。 这是我的媒体记录器代码。 我得到的运行时异常是 请帮助我如何解决这个问题。 提前致谢
我使用media Recorder library来记录语音通话,除了android Oreo8.0API level 27之外,它在几乎android版本中都工作得很好。当我使用音频源VOICE_CALL时,我得到了运行时异常启动失败,当我使用音频源VOICE_COMMUNICATION时,我没有得到对方的声音,我只得到了我的声音。 你能帮忙吗
我已经创建了一个android应用程序,使用媒体播放器播放文本到语音文件,但是如果其他音频/视频开始播放,那么我的音频也会播放,即同时播放两个音频。 有没有办法在开始另一个音频/视频之前停止第一个音频。 是否有任何广播接收器会在其他音频开始时被调用。 我用过- layer.play播放音频。 和暂停音频。 任何帮助都将不胜感激。
大家好,我正在尝试使用两个独立的媒体播放器实例播放音频和视频文件。当我从一开始播放它时,它工作得很好。但当我寻找时,我可以看到音频和视频的延迟 这是我寻找音频和视频的代码 //sikAudio(msec); if(media播放器!=null) { // 没有直播流,如果(medialayer.get持续时间() }