如何转换内置Android摄像头录制的视频编解码器?

时间:2017-10-12 07:50:00

标签: android video android-camera mediacodec

我用android的内置摄像头录制视频,但是当我通过Retrofit2发送到服务器时,浏览器中无法看到视频。经过长时间的搜索,我知道我用android录制的视频,编解码器是MP42所以我需要将其转换为H.264编解码器,以便在浏览器中播放。

以下是我捕捉视频的方式

 private void recordVideo() {

        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

        fileUri = getOutputMediaFileUri();
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
        intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT,15);
        startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == RECORD_VIDEO_PERMISSION && resultCode == RESULT_OK){
            Uri uri =data.getData(); //so the video file I get it here 
            Log.d("videoData",data.getData().toString());
            videoView.setVideoURI(uri);
            videoView.start();
        }
    }

我在onActivityResult中获得视频的视频,视频位于MP42编解码器中,如何将其转换为H.264

我尝试使用MediaCodec Documentation,但我不知道在哪里输入我的Uri(mp42)来获取H.264编解码器视频中的输出(我想在浏览器中播放)。< / p>

有人请给我一些指导......

1 个答案:

答案 0 :(得分:2)

(1)修复当前视频文件:

您的视频格式为 H.263 (或Mpeg-2),使用的是Simple个人资料。正如你所说,这意味着你必须转换。您必须使用一些免费的视频工具重新编码进入H.264任务。

例如:使用Handbrake即可...

  • 选择打开&#34;不播放&#34; MP4文件。应检测为MP4,现在勾选(或启用)选项web optimized

  • Video设置标签中,选择编码器Profile主要,编码器level 3

  • Destination中输入您首选的输出文件夹和文件名。
    (只需浏览到某个文件夹,然后在此处输入您要创建的新文件名)。

  • 点击绿色按钮Start Encode并在浏览器中测试新的MP4输出文件。

(2)修复未来录制的Android代码:

您必须在MediaRecorder对象设置中将编解码器设置为H.264,如:

myMediaRec = new MediaRecorder(); //create MediaRecorder object
myMediaRec.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //set video codec

所以基本上你的代码应该是这样的:(未经测试的代码,只是用于学习或指导)......

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if(requestCode == RECORD_VIDEO_PERMISSION && resultCode == RESULT_OK)
    {
        //# Create a new instance of MediaRecorder
        myMediaRec = new MediaRecorder(); //create MediaRecorder object
        mMediaRec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        myMediaRec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        //# Video settings
        myMediaRec.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //contained inside MP4
        myMediaRec.setVideoSize(640, 480); //width 640, height 480
        myMediaRec.setVideoFrameRate(30);  //30 FPS
        myMediaRec.setVideoEncodingBitRate(3000000); //adjust this for picture quality

        //# Audio settings
        myMediaRec.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //must always be AAC
        myMediaRec.setAudioEncoder(MediaRecorder.getAudioSourceMax());
        myMediaRec.setAudioEncodingBitRate(16);
        myMediaRec.setAudioSamplingRate(44100);

    }
}