相关疑难解决方法(0)

MediaRecorder.stop()停止失败:-1007

我正在使用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)

android video-capture mediarecorder android-mediarecorder

28
推荐指数
2
解决办法
2万
查看次数

使用MediaCodec将一系列图像保存为视频

我正在尝试将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)

video android mediacodec

16
推荐指数
1
解决办法
1万
查看次数

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

我有一个管理自己的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 mediacodec

11
推荐指数
1
解决办法
6969
查看次数

Android - 在MediaRecorder,MediaCodec和Ffmpeg之间进行选择

我正在为Android开发视频录制和共享应用程序.该应用程序的规格如下: -

  • 从应用程序内部录制10秒(最大)视频(不使用设备的相机应用程序)
  • 没有进一步编辑视频
  • 将视频存储在Firebase云存储(GCS)存储桶中
  • 其他用户下载和播放所述视频

从研究中我做了SO和其他人的来源,我发现了以下内容(如果我错了请纠正我): -

这三个选项及其各自的特点是: -

1. Ffmpeg

  • 无论如何能够实现上述目标,并在SO等网站上有广泛的答案和解释
  • APK大小增加20-30mb(大型图书馆)
  • 在某些64位设备上运行不正常的风险

2. MediaRecorder

  • 大多数设备可靠且支持
  • 将以.mp4格式存储文件(除非转换为h264)
  • 更易于播放(无需解码)
  • 添加mp4和3gp标头
  • 根据此问题增加延迟

3. MediaCodec

  • 低级
  • 将需要MediaCodec,MediaMuxer和MediaExtractor
  • 以h264输出(不使用MediaMuxer进行播放)
  • 适合视频操作(但在我的用例中不需要)
  • 4.3之前的(API 18)设备不支持
  • 更难以实现和编码(我的意见 - 如果我错了,请纠正我)
  • 没有广泛的信息,教程,答案或样本(Bigflake.com是唯一的例外)

花了好几天后,我仍然无法弄清楚哪种方法适合我的特定用例.请详细说明我应该为我的申请做些什么.如果有一种完全不同的方法,那么我也对此持开放态度.

我最大的标准是视频编码过程尽可能高效,并且要存储在云中的视频应该具有尽可能低的空间使用率,而不会影响视频质量.

另外,如果您可以建议在Firebase存储中保存和分发视频的相应格式,我将不胜感激,并指出我建议方法的教程或示例.

先感谢您!很抱歉长时间阅读.

video android ffmpeg mediarecorder mediacodec

11
推荐指数
1
解决办法
3370
查看次数

OpenGL表面的Android视频录制(GLSURFACEVIEW)

我正在开发一个项目,我们需要记录渲染的OpenGL表面.(例如,如果我们使用GLsurfaceView,我们需要记录表面以及来自MIC的音频)

目前我通过将视频源设置为使用MediaRecorder API VIDEO_SOURCE_GRALLOC_BUFFER.

我使用以下示例作为基本代码

我想知道 ....

  1. 这是正确的方法吗?.还有更好的替代品吗?
  2. 链接中给出的样本测试记录了EGLSURFACE的音频和视频,但显示不正确.

可能是什么原因?
任何帮助/指针真的很感激.

谢谢,
萨蒂什

android opengl-es mediarecorder

8
推荐指数
1
解决办法
9165
查看次数

Android Camera2输出尺寸

我在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 android-camera android-5.0-lollipop

8
推荐指数
2
解决办法
2万
查看次数

如何在Android中录制视频时嵌入文本?

我的目标是在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.需要帮助才能在视频录制的同一表面上绘制文本,这样它就会像白盒一样嵌入到它中.

video android opengl-es mediacodec

6
推荐指数
1
解决办法
4014
查看次数

android - MediaCodec - 将图像编码为 mp4 视频

我正在尝试将一组图像转换为 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)

video android image android-mediacodec

5
推荐指数
1
解决办法
2964
查看次数