Android开发——静音录制视频上传到服务器

最近项目有个需求是:静音录制视频,上传到服务器,在网上搜了很多方法,也没有很好的解决。最后想了一种代替方法,录制的时候还是有声录制,在录制完后,只提取视频中的视频流,不要音频,再将提取出来的数据做成一个MP4文件上传。下面是源码:

import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.MediaMuxer;

import java.io.File;
import java.nio.ByteBuffer;

/**
 * Created by gouhao on 12/8/2016.
 */
public class VideoUtils {

    public static void extractVideoFromMediaFile(String filePath) {
        //存放提取视频的临时文件
        String tPath = filePath.replace(".mp4", "tmp.mp4");
        MediaExtractor mediaExtractor = new MediaExtractor();
        MediaMuxer mediaMuxer = null;
        try {
            mediaExtractor.setDataSource(filePath);
            int tVideoIndex = findVideoTrackIndex(mediaExtractor);
            if(tVideoIndex == -1) {
               return;
            }
            MediaFormat trackFormat = mediaExtractor.getTrackFormat(tVideoIndex);
            mediaExtractor.selectTrack(tVideoIndex);
            int frameRate;
            //获取帧率,有的视频的信息中没有帧率这个KEY
            if(trackFormat.containsKey(MediaFormat.KEY_FRAME_RATE)) {
                frameRate = trackFormat.getInteger(MediaFormat.KEY_FRAME_RATE);
            } else {
                frameRate = 20;
            }
            mediaMuxer = new MediaMuxer(tPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
            mediaMuxer.setOrientationHint(trackFormat.getInteger(MediaFormat.KEY_ROTATION));
            int videoTrackIndex = mediaMuxer.addTrack(trackFormat);
            mediaMuxer.start();
            muxVideo(mediaExtractor, mediaMuxer, videoTrackIndex, frameRate);
            deleteSourceRenameNew(filePath, tPath);
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            mediaExtractor.release();
            mediaMuxer.stop();
            mediaMuxer.release();
        }
    }

    private static int findVideoTrackIndex(MediaExtractor mediaExtractor) {
        int trackCount = mediaExtractor.getTrackCount();
        for (int i = 0; i < trackCount; i++) {
            MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
            String mineType = trackFormat.getString(MediaFormat.KEY_MIME);
            if (mineType.startsWith("video/")) {
                return i;
            }
        }
        return -1;
    }

    protected static void muxVideo(MediaExtractor mediaExtractor, MediaMuxer mediaMuxer, int videoTrackIndex, int frameRate) {
        if (mediaMuxer == null) return;
        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
        info.presentationTimeUs = 0;
        ByteBuffer byteBuffer = ByteBuffer.allocate(500 * 1024);
        int readSampleCount = 0;
        while (true) {
            readSampleCount = mediaExtractor.readSampleData(byteBuffer, 0);
            if (readSampleCount < 0) {
                break;
            }
            info.offset = 0;
            info.size = readSampleCount;
            info.flags = MediaCodec.BUFFER_FLAG_KEY_FRAME;
            info.presentationTimeUs += 1000 * 1000 / frameRate;
            mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, info);
            mediaExtractor.advance();
        }
    }

    protected static void deleteSourceRenameNew(String filePath, String tPath) {
        File videoFile = new File(tPath);
        if (videoFile != null) {
            new File(filePath).delete();
            File f = new File(filePath);
            videoFile.renameTo(f);
        }
    }
}
主要用了MediaExtractor和MediaMuxer这两个Andoird自带的提取器和合成器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值