4

ここで説明されているように、クラスを使用しmpeg2-tsてストリーミングするためにビデオを録画しようとしています...server / socketAndroid MediaRecorder

コードは次のとおりです。

public class MediaRecorderDemo extends Activity
{
private final static String TAG = "MediaRecorderDemo";
Camera camera;
CameraPreview cameraPreview;
MediaRecorder mediaRecorder;
File outputFile = new File(Environment.getExternalStorageDirectory().getPath() + "/out1.ts");

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.media_recorder_demo_layout);

    camera = getCameraInstance();
    cameraPreview = new CameraPreview(this);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(cameraPreview);
}

private Camera getCameraInstance()
{
    final String FUNCTION = "getCameraInstance";

    Camera c = null;
    try
    {
        c = Camera.open();
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }

    return c;
}

void initMediaRecorder()
{
    final String FUNCTION = "initMediaRecorder";
    FileDescriptor outputFileFD = null;
    try
    {
        outputFile.createNewFile();
        outputFileFD = new FileOutputStream(outputFile).getFD();
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }

    mediaRecorder = new MediaRecorder();
    mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
        final static String TAG = "MediaRecorder.onErrorListener";

        @Override
        public void onError(MediaRecorder mr, int what, int extra) {
            Log.e(TAG, "Error : " + what + " " + extra);
        }
    });

    camera.unlock();
    mediaRecorder.setPreviewDisplay(cameraPreview.getHolder().getSurface());
    mediaRecorder.setCamera(camera);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    //mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
    mediaRecorder.setOutputFormat(8);
    Log.d(TAG, "File Exists : " + outputFile.exists());
    mediaRecorder.setOutputFile(outputFileFD);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    //mediaRecorder.setVideoSize(640, 480);
    mediaRecorder.setMaxDuration(-1);
    //mediaRecorder.setVideoFrameRate(16);
    mediaRecorder.setVideoEncodingBitRate(1024 * 1024);

    try
    {
        mediaRecorder.prepare();
        Log.d(TAG, "MediaRecorder Prepared.");
        mediaRecorder.start();

    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
        //releaseMediaRecorder();
    }
}

void releaseMediaRecorder()
{
    final String FUNCTION = "releaseMediaRecorder";

    try
    {
        if(mediaRecorder != null)
        {
            mediaRecorder.stop();
            mediaRecorder.reset();
            mediaRecorder.release();
            mediaRecorder = null;
            camera.lock();
        }
    }

    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }
}

void releaseCamera()
{
    final String FUNCTION = "releaseCamera";
    try
    {
        if(camera != null)
        {
            camera.stopPreview();
            camera.release();
        }
        camera = null;
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }
}

@Override
public void onStart()
{
    super.onStart();
}

@Override
public void onPause()
{
    super.onPause();
}

@Override
public void onResume()
{
    super.onResume();
}

@Override
public void onStop()
{
    super.onStop();
}

@Override
public void onDestroy()
{
    super.onDestroy();
}

public class CameraPreview extends SurfaceView
{
    private final static String TAG = "CameraPreview"; 
    SurfaceHolder holder;
    boolean isPreviewDisplaySet;

    public CameraPreview(Context context)
    {
        this(context, (AttributeSet)null);

        this.holder = getHolder();
        this.holder.addCallback(new SurfaceHolderCallback());
    }

    public CameraPreview(Context context, AttributeSet attrSet)
    {
        this(context, attrSet, 0);
    }

    public CameraPreview(Context context, AttributeSet attrSet, int defStyle)
    {
        super(context, attrSet, defStyle);
    }

    private void releaseCamera()
    {
        if(camera != null)
        {
            camera.release();
            camera = null;
        }
    }

    private class SurfaceHolderCallback implements SurfaceHolder.Callback
    {
        @Override
        public void surfaceCreated(SurfaceHolder holder)
        {
            final String FUNCTION = "surfaceCreated";
            Log.d(TAG, "Surface Created.");

            try
            {
                camera.setPreviewDisplay(holder);
                camera.startPreview();

                initMediaRecorder();
                //mediaRecorder.start();
            }
            catch(Exception e)
            {
                Log.e(TAG, FUNCTION + " : " + e.getMessage());
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder)
        {
            final String FUNCTION = "surfaceDestroyed";
            Log.d(TAG, "Surface Destroyed.");

            try
            {
                releaseMediaRecorder();
                releaseCamera();
            }
            catch(Exception e)
            {
                Log.e(TAG, FUNCTION + " : " + e.getMessage());
            } 
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
        {
            final String FUNCTION = "surfaceChanged";
            Log.d(TAG, "Surface Changed.");

            if(holder.getSurface() == null)
                return;

            try
            {
                camera.stopPreview();
            }
            catch(Exception e)
            {
                Log.e(TAG, FUNCTION + " : " + e.getMessage());
            }

            try
            {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            }
            catch(Exception e)
            {
                Log.e(TAG, FUNCTION + " : " + e.getMessage());
            }
        }
    }
}
}

mediaRecorder.prepare()とがエラーなしで呼び出され、mediaRecorder.start()カメラのプレビューが表示されます... しかし、しばらくするとプレビューが途切れ、画面がフリーズし、出力パスに空のファイルが作成されます... この問題は、 にも報告されています。Androidの問題リストですが、まだ修正されていません...

ストックAndroid ICS ROMを搭載したGalaxy Note N7000と、カスタムAndroid 4.2 ROMを搭載したSamsung Galaxy Tab 2 P3100で同じアプリを実行しようとしました...したがって、ROMに関連するものではないようです。特定のハードウェア構成...

何か足りないところや間違っているところがあれば、それを知って喜んで安心するでしょうか...?

ありがとう...

4

2 に答える 2

-1

同じデバイス上ではありませんが、私はあなたと同様の問題を抱えています。最初の調査によると、mpeg ts の記録中に、HAL のカメラの記録ヒープ (バッファ) が正しく解放されませんでした。しかし、yuv データが OMX に到達したかどうかはまだよくわかりません。高度な原因は、各ハードウェア ベンダーで確認する必要があります。それが役に立てば幸い。:)

于 2013-03-26T03:21:40.500 に答える