java - 安卓 camera2 api 银河 s7

标签 java android video android-camera2

我正在编写一个应用程序,用于录制手机中的视频并将其上传到服务器。适用于除 Galaxy S7 之外的任何设备。在 Galaxy S7 上,录制会生成一个只有音频的视频文件,或者没有视频,或者只有一个视频帧。在手机上创建的临时文件中确实如此,而不仅仅是上传到服务器的临时文件。 我使用的是 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) 英语语言 分辨率:960x720 显示分辨率:960x720 帧率:29.055091

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

最佳答案

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

Samsung Galaxy S7(我认为是 S6)有一个错误,会导致编码困惑。 解决方法是使用以下函数重新编码。

请注意,您的 gradle 中需要此依赖项: 编译 '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");
    }
}

关于java - 安卓 camera2 api 银河 s7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45358247/

相关文章:

java - 房间仪器测试

java - onResume() 只有在 Resume Activity 时

java - 同一个包中的类彼此不通信

android - 通知操作按钮外观

python - 如何从提取的帧中制作视频?

java - 将 SQLite 数据库值添加到 ListView

java - 构建 JAR 后无法构建 Android,并出现错误 "Failed resolution of R$color"

Android - 禁用操作栏中的设置

java - 我可以使用什么库在 Java Applet 中对视频进行编码?

android - 我应该使用哪个图像处理库来创建视频幻灯片?