首页 > 解决方案 > Mp4Parser 输出视频不在任何播放器中播放

问题描述

我正在尝试替换 mp4 视频的音频。我有一个 mp4 源文件和一个 .aac 音频文件。我从本机 android MediaRecorder 录制的 Mp4 文件下面是我用于录制 mp4 视频的代码。

 public void initRecorder(File saveToFile, int displayWidth, int displayHeight,
                             int desiredWidth, int desiredHeight, int orientationHint,
                             MediaRecorder.OnErrorListener errorListener,
                             MediaRecorder.OnInfoListener infoListener)
            throws IOException {

        MediaRecorder mediaRecorder = new MediaRecorder();

        mediaRecorder.setOnInfoListener(infoListener);

        mediaRecorder.setOnErrorListener(errorListener);

        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mediaRecorder.setInputSurface(mSurface);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mediaRecorder.setAudioSamplingRate(44100);
        mediaRecorder.setAudioEncodingBitRate(96000);

        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

        mediaRecorder.setVideoEncodingBitRate(12000000);
        mediaRecorder.setVideoFrameRate(30);

        if(desiredWidth > desiredHeight){
            float desiredAspect = 1080.0f / 2280.0f;

            if(desiredWidth > 2280 || desiredHeight > 1080){
                float aspect = (float) desiredHeight / desiredWidth;
                if(aspect > desiredAspect){
                    desiredHeight = 1080;
                    desiredWidth = (int) Math.floor(desiredHeight / aspect);
                } else {
                    desiredWidth = 2280;
                    desiredHeight = (int) Math.floor(desiredWidth * aspect);
                }
            }
        } else {
            float desiredAspect = 2280.0f / 1080.0f;

            if(desiredWidth > 1080 || desiredHeight > 2280){
                float aspect = (float) desiredHeight / desiredWidth;
                if(aspect > desiredAspect){
                    desiredHeight = 2280;
                    desiredWidth = (int) Math.floor(desiredHeight / aspect);
                } else {
                    desiredWidth = 1080;
                    desiredHeight = (int) Math.floor(desiredWidth * aspect);
                }
            }
        }

        mDesiredHeight = desiredHeight;
        mDesiredWidth = desiredWidth;


        mediaRecorder.setVideoSize(mDesiredWidth, mDesiredHeight);

        mediaRecorder.setOrientationHint(orientationHint);

        mediaRecorder.setOutputFile(saveToFile.getPath());
        mediaRecorder.prepare();

        mMediaRecorder = mediaRecorder;

    }


上面的 MediaRecorder 对象用于生成 mp4 视频文件。我从一些互联网来源下载了 .aac 文件,我不知道它的比特率、编码等。
我使用以下代码将 .aac 与 mp4 合并/混合。

Movie m = MovieCreator.build(video);
List nuTracks = new ArrayList<>();
for (Track t : m.getTracks()) {
        if (!"soun".equals(t.getHandler())) {
        nuTracks.add(t);
        Log.d(TAG,"found video track");
        }
    }
Track nuAudio = new AACTrackImpl(new FileDataSourceImpl(audio));
Track crop_track= CropAudio(video,nuAudio);
nuTracks.add(crop_track);
m.setTracks(nuTracks);
Container mp4file = new DefaultMp4Builder().build(m);
FileChannel fc = new FileOutputStream(new File(output)).getChannel();
mp4file.writeContainer(fc);
fc.close();
// sending final output file to player.

输出文件在某些​​播放器中不播放,在某些播放器中播放时没有音频。我也尝试在 ubuntu 视频播放器中播放输出文件,但也无法正常工作。我不确定我在做什么错,但怀疑它可能是不同的编码问题,但不知道如何处理。任何想法/建议都会有所帮助。

Input-mp4_file
input-aac-file
Output-file-getting-from-mp4parser-not-paying-in-many-players

标签: androidvideomp4parser

解决方案


推荐阅读