代码之家  ›  专栏  ›  技术社区  ›  user3561494

Android camera2 api galaxy s7

  •  6
  • user3561494  · 技术社区  · 7 年前

    我正在使用Camera2 API,我已经尝试了前后摄像头。

    我已经尝试了我的代码和以下两个示例应用程序: 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-4 AVC(第10部分)(avc1)

    类型:音频 编解码器:MPEG AAC音频(mp4a) 通道:立体声 采样率:16000 Hz

    1 回复  |  直到 7 年前
        1
  •  3
  •   user3561494    7 年前

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

    三星Galaxy S7(我认为还有S6)有一个错误,它扰乱了编码。

    编译“com.googlecode.mp4parser:isoparser:1.1.22”

        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");
        }
    }