带FileDescriptor的Android MediaRecorder:在SD卡上保存mp4视频

时间:2016-05-17 22:09:29

标签: android video sd-card file-descriptor mediarecorder

我想录制视频并将其保存在SD卡上。因为我想对视频进行一些修改(后来!刚才我要保存mp4视频)我决定使用FileDescriptor。 我在这里设置了MediaRecorder:

 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
        mNextVideoAbsolutePath = getVideoFilePath(getActivity());
    }

//the output file is a FileDescriptor
  mMediaRecorder.setOutputFile(getStreamFd());

 mMediaRecorder.setVideoEncodingBitRate(10000000);
 mMediaRecorder.setVideoFrameRate(30);
 mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

存储视频的目标:

private String getVideoFilePath(Context context) {
    return context.getExternalFilesDir(null).getAbsolutePath() + "/"
           + System.currentTimeMillis() + ".mp4";
}

的FileDescriptor:

private FileDescriptor getStreamFd() {
    ParcelFileDescriptor[] pipe=null;

    try {
        pipe=ParcelFileDescriptor.createPipe();
        new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(pipe[0]),
        new FileOutputStream(mNextVideoAbsolutePath)).start();
    }
    catch (IOException e) {
        Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
    }

    return(pipe[1].getFileDescriptor());
}

在传输线程中保存视频:

static class TransferThread extends Thread {
    InputStream in;
    FileOutputStream out;

    TransferThread(InputStream in, FileOutputStream out) {
        this.in=in;
        this.out=out;
    }

    @Override
    public void run() {
        byte[] buf=new byte[8192];
        int len;

        try {
            while ((len=in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }

            in.close();

            out.flush();
            out.getFD().sync();
            out.close();
        }
        catch (IOException e) {
            Log.e(getClass().getSimpleName(),
                    "Exception transferring file", e);
        }

    }
}

当我运行应用程序时,会创建一个视频。视频有mp4扩展,视频大小似乎没问题。

但我无法播放视频。

我尝试了不同的VideoEncoders或OutputFormats,但没有任何成功。

还有一个类似的问题:Anyone Have MediaRecorder Working with ParcelFileDescriptor and createPipe()? 但它与我的问题不符。我已在清单中设置了所有必要的权限。

视频标题是否有问题?

0 个答案:

没有答案