首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android camera2 api银河s7

Android camera2 api银河s7
EN

Stack Overflow用户
提问于 2017-07-28 02:16:37
回答 1查看 1.3K关注 0票数 6

我正在编写一个应用程序,从手机上录制视频,并上传到服务器。在除Galaxy S7以外的任何设备上都能正常工作。在Galaxy上,S7录制会生成一个只有音频的视频文件,没有视频或只有一个视频帧。这适用于在手机上创建的临时文件,而不仅仅是上传到服务器的临时文件。我正在使用Camera2应用程序接口,并且我已经尝试了前后摄像头。

我已经尝试过使用我的代码,下面是两个示例应用程序:https://developer.android.com/samples/Camera2Video/project.html https://github.com/googlesamples/android-Camera2Video/blob/master/Application/src/main/java/com/example/android/camera2video/Camera2VideoFragment.java

生成的视频文件看起来没有问题,以下是编解码器信息:流0类型:视频编解码器: H264 -MPEG-4avc(第10部分) (avc1)语言:英语分辨率: 960x720显示分辨率: 960x720帧率: 29.055091

流1类型:音频编解码器: MPEG AAC音频(mp4a)语言:英语频道:立体声采样率: 16000 Hz

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 23:43:58

经过几天的工作,我找到了答案。

三星盖乐世S7 (我想还有S6 )有一个bug,会把编码搞乱。修复方法是使用下面的函数重新编码。

注意,在gradle中需要这个依赖:编译'com.googlecode.mp4parser:isoparser:1.1.22‘

代码语言:javascript
复制
    public void fixSamsungBug()
{
    DataSource channel = null;
    try
    {
        channel = new FileDataSourceImpl(app.dataMgr.videoFileURL);
    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }

    IsoFile isoFile = null;

    try
    {
        isoFile = new IsoFile(channel);
    } catch (IOException e)
    {
        e.printStackTrace();
    }

    List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class);
    boolean sampleError = false;
    for (TrackBox trackBox : trackBoxes) {
        TimeToSampleBox.Entry firstEntry = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox().getTimeToSampleBox().getEntries().get(0);

        // Detect if first sample is a problem and fix it in isoFile
        // This is a hack. The audio deltas are 1024 for my files, and video deltas about 3000
        // 10000 seems sufficient since for 30 fps the normal delta is about 3000
        if(firstEntry.getDelta() > 10000) {
            sampleError = true;
            firstEntry.setDelta(3000);
        }
    }

    if(sampleError) {
        Log.d("gpinterviewandroid", "Sample error! correcting...");
        Movie movie = new Movie();
        for (TrackBox trackBox : trackBoxes) {
            movie.addTrack(new Mp4TrackImpl(channel.toString() + "[" + trackBox.getTrackHeaderBox().getTrackId() + "]" , trackBox));
        }
        movie.setMatrix(isoFile.getMovieBox().getMovieHeaderBox().getMatrix());
        Container out = new DefaultMp4Builder().build(movie);

        //delete file first!
        File file = new File(app.dataMgr.videoFileURL);
        boolean deleted = file.delete();


        FileChannel fc = null;
        try
        {
            //fc = new FileOutputStream(new File(app.dataMgr.videoFileURL)).getChannel();
            fc = new RandomAccessFile(app.dataMgr.videoFileURL, "rw").getChannel();
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }

        try
        {
            out.writeContainer(fc);
            fc.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        }

        Log.d("gpinterviewandroid", "Finished correcting raw video");
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45358247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档