bytedeco/javacv

ffmpeg audio out of sync and error at end of run

Open

#128 ouverte le 17 avr. 2015

Voir sur GitHub
 (34 commentaires) (0 réactions) (0 assignés)Java (1 583 forks)batch import
enhancementhelp wanted

Métriques du dépôt

Stars
 (6 985 stars)
Métriques de merge PR
 (Aucune PR mergée en 30 j)

Description

I have an issue where the audio gets out of sync with the video farther into the video. I have tried many different things to try and fix it and I am at a loss. Anyone that can help I would appreciate it

JAVA- java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

FFMPEG- ffmpeg version 2.4.1 Copyright (c) 2000-2014 the FFmpeg developers built on Sep 23 2014 08:09:44 with llvm-gcc 4.2.1 (LLVM build 2336.11.00)

Here is the error I get at the end of the process:

[h264 @ 0x7ff6c4236000] error while decoding MB 25 31, bytestream -18
[h264 @ 0x7ff6c4236000] Cannot use next picture in error concealment
[h264 @ 0x7ff6c4236000] concealing 1144 DC, 1144 AC, 1144 MV errors in P frame

Here is the code use: As you can see I have tried many different things, moved things around, played with diff settings, etc.

The command line ffmpeg example is: command line uses the following switches without any issue at all.

                     "-i", url,
                     "-bsf:a", "aac_adtstoasc",
                     "-vcodec", "copy",
                     "-c", "copy",

HLS is the HTTP Address


                 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(HLS);
                    grabber.start();

                    //grabber.setTimestamp((1 * 60 + 30) * 1000000);
                    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getAudioChannels());
                    recorder.setFrameRate(grabber.getFrameRate());

                    recorder.setFormat("mp4");

                    recorder.setImageHeight(grabber.getImageHeight());
                    recorder.setImageWidth(grabber.getImageWidth());

                    recorder.setSampleRate(grabber.getSampleRate());
                    recorder.setVideoBitrate(grabber.getVideoBitrate());
                    //recorder.setInterleaved(false);
                    recorder.setVideoCodec(AV_CODEC_ID_H264);
                    //recorder.setVideoCodecName("x264");

                    recorder.setAudioCodec(grabber.getAudioCodec());
                    recorder.setAudioBitrate(grabber.getAudioBitrate());
                    recorder.setAudioChannels(grabber.getAudioChannels());

                    /*
                     command line        
                     "-i", url,
                     "-bsf:a", "aac_adtstoasc",
                     "-vcodec", "copy",
                     "-c", "copy"
                     */
                    // recorder.setAudioOption("async", "50");
                    //av_bitstream_filter_init("aac_adtstoasc");

                    recorder.setVideoOption("preset", "ultrafast");
                    recorder.setVideoOption("c", "copy");

                    recorder.setVideoCodecName("H.264");
                    recorder.setAudioCodecName("copy");
                    recorder.setAudioOption("bsf:a", "aac_adtstoasc");

                    recorder.setAudioOption("desync", "10");
                    //recorder.setVideoOption("skip_frame", "nokey");
                    //recorder.setVideoOption("qpmax", "51");
                    //recorder.setVideoOption("qpmin", "10");
                    recorder.setVideoOption("audio-sync", "");
                    //recorder.setVideoOption("bframes", "16");
                    //recorder.setVideoOption("keyint_min", "25");
                    //recorder.setVideoOption("keyint", "25");

                    //-skip_frame -nokey 
                    // org.bytedeco.javacpp.avformat.
                    //recorder.setAudioQuality();
                    // recorder.setInterleaved(false);
                    //recorder.setAudioCodec(org.bytedeco.javacpp.avcodec.AV_CODEC_ID_AAC  );//aac_adtstoasc
                    //   recorder.setPixelFormat(avutil.);
                  recorder.setVideoOption("threads", "1");
                    recorder.start();
                    recorder.setPixelFormat(grabber.getPixelFormat());

                    recorder.setTimestamp(grabber.getTimestamp());


                    Frame frame;
                    int allFrames = grabber.getLengthInFrames();

                    float percentage = 0;
                    float lastpercentage = 1;
                    System.out.println("Total frames to process " + grabber.getLengthInFrames());
                    //recorder.setFrameRate();
                    System.out.println("Start Frame = " + grabber.getFrameNumber());
                    while ((frame = grabber.grab()) != null) {
                        recorder.record(frame);
                        // Testing
                        recorder.setSampleRate(grabber.getSampleRate());
                        recorder.setVideoBitrate(grabber.getVideoBitrate());
                        recorder.setAudioBitrate(grabber.getAudioBitrate());
                        recorder.setAudioChannels(grabber.getAudioChannels());
                        recorder.setFrameRate(grabber.getFrameRate());
                        // End Testing

                        percentage = ((float) grabber.getFrameNumber() * 100) / allFrames;
                        if (!String.format("%.0f%%", percentage).equals(String.format("%.0f%%", lastpercentage))) {
                            System.out.println("Percentage Complete " + String.format("%.0f%%", percentage) + "\r");
                            lastpercentage = percentage;
                           }


                    }

                    recorder.stop();
                    recorder.release();
                    grabber.stop();
                    grabber.release();

Guide contributeur