【问题标题】:How to convert codec of video recorded by inbuilt Android camera?如何转换内置 Android 摄像头录制的视频编解码器?
【发布时间】:2017-10-12 07:49:59
【问题描述】:

我使用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 中获得了视频的uri,视频在MP42 编解码器中,如何将其转换为H.264

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

有人请给我一些指导..

【问题讨论】:

  • mp42 是一个容器(它也是一个 MScodec,但怀疑这里就是这种情况) - 你能分享一个示例视频的链接,我们可以提供更好的帮助
  • 这个视频是MP42,我直接上传到服务器..它看起来像这样
  • 使用MediaRecorder API 捕捉视频。在设置代码期间,您可以选择 H.264 作为编解码器。

标签: android video android-camera android-mediacodec


【解决方案1】:

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

您的视频格式为 H.263(或 Mpeg-2),使用 Simple 配置文件。正如您所说,这意味着您必须转换。您必须使用一些免费的视频工具重新编码成 H.264 任务。

例如:使用Handbrake 你可以这样做...

  • 选择打开您的“未播放” MP4 文件。应该被检测为 MP4,现在勾选(或启用)选项web optimized

  • Video设置选项卡中,选择EncoderProfile作为Main,选择Encoderlevel作为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);

    }
}

【讨论】:

猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多