我正在使用MediaRecorder录制视频.我的代码在2.3.3上工作正常但在4.0.3上失败.
问题如下:代码mediaRecorder.stop()抛出RuntimeExeption
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
Run Code Online (Sandbox Code Playgroud)
使用LogCat消息
04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007
Run Code Online (Sandbox Code Playgroud)
UPDATE
我发现,MediaPlayer几乎在启动后立即报告错误(通过MediaPlayer.OnErrorListener).错误代码为100(媒体服务器死机),额外-1007.
更新2准备MediaRecorder的代码
c = Camera.open();
...
// Step 1: Unlock and set camera to MediaRecorder
camera.unlock();
mediaRecorder.setCamera(camera);
// Step 2: Set sources
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
// manual set up!
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth,
profile.videoFrameHeight);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setAudioEncoder(profile.audioCodec);
//mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoEncoder(profile.videoCodec);
// mediaRecorder.setProfile(profile);
// Step 4: Set output file …Run Code Online (Sandbox Code Playgroud) 我正在尝试将MediaCodec一系列图像(保存为文件中的字节数组)保存到视频文件中.我已经测试了这些图像SurfaceView(在系列中播放),我可以看到它们很好.我看了很多使用的例子MediaCodec,这是我理解的(如果我错了请纠正我):
从MediaCodec对象获取InputBuffers - >用你的帧的图像数据填充它 - >将输入缓冲区排队 - >获取编码输出缓冲区 - >将其写入文件 - >增加显示时间并重复
但是,我已经对此进行了很多测试,最终我遇到了两种情况之一:
queueInputBuffer在第二次调用时导致Media服务器死机.codec.flush()在最后调用(在将输出缓冲区保存到文件之后,虽然我看到的所有示例都没有这样做)并且媒体服务器没有死,但是,我无法使用任何媒体播放器打开输出视频文件,所以出了点问题.这是我的代码:
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 = false;
int inputBufferIndex=-1,outputBufferIndex=-1;
BufferInfo info=null;
//loop …Run Code Online (Sandbox Code Playgroud) 我有一个管理自己的GLSurfaceView的应用程序,现在我想使用Android 4.3的新MediaCodec功能,将Surface作为输入.
在我看过的所有示例中,使用MediaCodec.createInputSurface()创建Surface,然后为此Surface创建GL上下文.对于已经稳定的代码库进行改造,这感觉很单一,并且令人难以置信地具有破坏性.
是否可以使用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已经创建,EGL_RECORDABLE_ANDROID设置为true,并且验证返回的GL上下文包含所需的EGL_RECORDABLE_ANDROID属性.尽管如此,MediaCodec.configure()失败并出现无用的异常'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)
Run Code Online (Sandbox Code Playgroud)
这是来自Android 4.3的三星Galaxy S4.
我正在为Android开发视频录制和共享应用程序.该应用程序的规格如下: -
从研究中我做了SO和其他人的来源,我发现了以下内容(如果我错了请纠正我): -
这三个选项及其各自的特点是: -
1. Ffmpeg
2. MediaRecorder
3. MediaCodec
花了好几天后,我仍然无法弄清楚哪种方法适合我的特定用例.请详细说明我应该为我的申请做些什么.如果有一种完全不同的方法,那么我也对此持开放态度.
我最大的标准是视频编码过程尽可能高效,并且要存储在云中的视频应该具有尽可能低的空间使用率,而不会影响视频质量.
另外,如果您可以建议在Firebase存储中保存和分发视频的相应格式,我将不胜感激,并指出我建议方法的教程或示例.
先感谢您!很抱歉长时间阅读.
我正在开发一个项目,我们需要记录渲染的OpenGL表面.(例如,如果我们使用GLsurfaceView,我们需要记录表面以及来自MIC的音频)
目前我通过将视频源设置为使用MediaRecorder API VIDEO_SOURCE_GRALLOC_BUFFER.
我使用以下示例作为基本代码
我想知道 ....
可能是什么原因?
任何帮助/指针真的很感激.
谢谢,
萨蒂什
我在Android Lollipop上测试了新的Camera2 API.我想获取支持的预览尺寸:
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
Run Code Online (Sandbox Code Playgroud)
三星Galaxy Tab S的最大预览尺寸为1440x1080px,分辨率为2560x1600px.所以我的previewSize是1440x1080px,而TextureView表面尺寸是2560x1600px,因此图像会失真.
我测试了不推荐使用的旧Camera API.
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
Run Code Online (Sandbox Code Playgroud)
和上面的代码返回预览大小的32个组合山雀如:2560x1920,1920x1080,1080x1920,2560x2560等.在这种情况下,我能够选择最佳的尺寸,并显示正确的图像.
我不知道如何强制新的API来获得最佳的大小.我知道解决方案是调整显示预览的视图大小,但内置相机应用程序正常工作在全屏模式下.提前感谢所有建议!
我的目标是在Android中录制视频,并在录制时嵌入秒表.
我跟着的样品Grafika项目,CameraCaptureActivity.java他们使用OpenGL 2.0与录制视频录制为小块.他们使用以下代码在OpenGL 2.0中绘制块
private static void drawExtra()
{
GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
GLES20.glScissor(0, 0, width / 3, height / 3);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在录制和保存时在视频的左下方绘制了白色块.
我想要的是使用OpenGL 2.0 在白框上绘制文本,这样它也会与视频一起录制.
我不懂OpenGL 2.0.需要帮助才能在视频录制的同一表面上绘制文本,这样它就会像白盒一样嵌入到它中.
我正在尝试将一组图像转换为 mp4 视频。
我在创建视频时遇到了一些问题,我不确定我的代码是否正确以创建有效的 mp4 视频。
当我将结果视频与 FFmpeg 一起使用时,我遇到了很多问题。大量错误、警告,就好像我的视频编码不当一样。
我是不是忘记了什么或做错了什么?提前致谢
代码 :
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import android.media.MediaMuxer;
import android.util.Log;
import android.view.Surface;
import java.nio.ByteBuffer;
public class ImageVideoConverter {
private static final String TAG = "ImageVideoConverter";
private static final String OUTPUT_MIME = MediaFormat.MIMETYPE_VIDEO_AVC;
private static final int TIMEOUT_USEC = 10000;
private static final int frameRate = 30;
private static final int bitrate = 700000;
private static final int keyFrameInternal …Run Code Online (Sandbox Code Playgroud)