Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to give Fade out effect to audio with FFmpegFrameFilter #1171

Closed
ZeroOneZeroR opened this issue Apr 2, 2019 · 28 comments
Closed

How to give Fade out effect to audio with FFmpegFrameFilter #1171

ZeroOneZeroR opened this issue Apr 2, 2019 · 28 comments
Labels

Comments

@ZeroOneZeroR
Copy link

i want to give fade out effect to an audio at 3-5s of an 10s audio. i can change volume.

@saudet
Copy link
Member

saudet commented Apr 2, 2019

Duplicate of #928

@saudet saudet marked this as a duplicate of #928 Apr 2, 2019
@saudet saudet closed this as completed Apr 2, 2019
@ZeroOneZeroR
Copy link
Author

i want audio fade-out effect not video.

@saudet
Copy link
Member

saudet commented Apr 2, 2019

Ah, well, tt's the same thing, just use "afade" instead of "fade":
https://ffmpeg.org/ffmpeg-filters.html#afade-1

@ZeroOneZeroR
Copy link
Author

ZeroOneZeroR commented Apr 2, 2019

Okay, but if i push all the frames to filter and then pull the frames from filter, how FFmpegFrameFilter will give fade out only to the expected frames in range?

@ZeroOneZeroR
Copy link
Author

This gives "org.bytedeco.javacv.FrameFilter$Exception: avfilter_graph_parse_ptr() error -22" error

FFmpegFrameFilter filter = new FFmpegFrameFilter("setpts=N,afade=t=out:st=2:d=1",frameGrabber.getAudioChannels());

@ZeroOneZeroR
Copy link
Author

ZeroOneZeroR commented Apr 2, 2019

And this is not working. No error but no effect at all.

FFmpegFrameFilter filter = new FFmpegFrameFilter("afade=t=out:st=0:d=1",frameGrabber.getAudioChannels());

@saudet
Copy link
Member

saudet commented Apr 2, 2019 via email

@ZeroOneZeroR
Copy link
Author

Could you please give an example??? I am so lost.

@saudet
Copy link
Member

saudet commented Apr 3, 2019 via email

@ZeroOneZeroR
Copy link
Author

no log is given..... what should i do now?

@saudet
Copy link
Member

saudet commented Apr 4, 2019

Make sure to call FFmpegLogCallback.set() and try again.

@ZeroOneZeroR
Copy link
Author

In have set but again no log...

@saudet
Copy link
Member

saudet commented Apr 4, 2019 via email

@ZeroOneZeroR
Copy link
Author

FFmpegFrameFilter filter = new FFmpegFrameFilter("afade=t=out:st=0:d=1",frameGrabber.getAudioChannels());
filter.start();

                for(int i = 0 ;i<500; i++){
                    //recording video frame from bitmap
                    recorder.record(videoFrame);
                    
                    //recording audio frame with filter
                    Frame audioFrame = frameGrabber.grabSamples();
                    filter.push(audioFrame);
                    audioFrame = filter.pull();
                    recorder.record(audioFrame); 
                }

@saudet
Copy link
Member

saudet commented Apr 4, 2019 via email

@ZeroOneZeroR
Copy link
Author

ZeroOneZeroR commented Apr 4, 2019

// creating video recorder
                FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath, 600, 600);
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
                recorder.setFormat("mp4");
                recorder.setFrameRate(60);
                recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
                recorder.setVideoQuality(0);
                recorder.setAudioQuality(0);
                recorder.setVideoOption("crf", "14");
                recorder.setVideoOption("preset", "fast");
                recorder.setVideoOption("tune", "stillimage");

                //creating audio grabber
                FFmpegFrameGrabber audioFrameGrabber = new FFmpegFrameGrabber(audioStream);
                audioFrameGrabber.start();

                //setting audio channels to recorder from grabber
                recorder.setAudioChannels(audioFrameGrabber.getAudioChannels());

                //creating fade filter
                FFmpegFrameFilter filter = new FFmpegFrameFilter("afade=t=out:st=0:d=1",frameGrabber.getAudioChannels());
                filter.start();
                
                //starting recorder
                recorder.start();


                for(int i = 0 ;i<500; i++){
                    //recording video frame from bitmap
                    recorder.record(videoFrame);

                    //recording audio frame with filter
                    Frame audioFrame = frameGrabber.grabSamples();
                    filter.push(audioFrame);
                    audioFrame = filter.pull();
                    recorder.record(audioFrame);
                }

@saudet
Copy link
Member

saudet commented Apr 4, 2019

It still doesn't compile, what is audioStream?

@ZeroOneZeroR
Copy link
Author

audioStream is InputStream from android raw

@ZeroOneZeroR
Copy link
Author

String videoFilePath = Environment.getExternalStorageDirectory()+"/"+"output.mp4";
Uri audioUri = Uri.parse("android.resource://"+getPackageName()+"/raw/"+"my_audio_file_name");

            InputStream audioStream;
            try{
                audioStream = getContentResolver().openInputStream(audioUri);
            }catch(Exception e){
                
            }
            
            //creating android frame converter
            AndroidFrameConverter frameConverter = new AndroidFrameConverter();
            
            // creating video recorder
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath, 600, 600);
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
            recorder.setFormat("mp4");
            recorder.setFrameRate(60);
            recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
            recorder.setVideoQuality(0);
            recorder.setAudioQuality(0);
            recorder.setVideoOption("crf", "14");
            recorder.setVideoOption("preset", "fast");
            recorder.setVideoOption("tune", "stillimage");

            //creating audio grabber
            FFmpegFrameGrabber audioFrameGrabber = new FFmpegFrameGrabber(audioStream);
            audioFrameGrabber.start();

            //setting audio channels to recorder from grabber
            recorder.setAudioChannels(audioFrameGrabber.getAudioChannels());

            //creating fade filter
            FFmpegFrameFilter filter = new FFmpegFrameFilter("afade=t=out:st=0:d=1",frameGrabber.getAudioChannels());
            filter.start();

            //starting recorder
            recorder.start();


            for(int i = 0 ;i<500; i++){
                //recording video frame from bitmap
                Bitmap bitmap = Bitmap.createBitmap(600,600, Bitmap.Config.ARGB_8888);
                recorder.record(frameConverter.convert(bitmap));

                //recording audio frame with filter
                Frame audioFrame = frameGrabber.grabSamples();
                filter.push(audioFrame);
                audioFrame = filter.pull();
                recorder.record(audioFrame);
            }
            
            filter.stop();
            filter.release();
            
            audioFrameGrabber.stop();
            audioFrameGrabber.release();
            
            recorder.stop();
            recorder.release();

@saudet
Copy link
Member

saudet commented Apr 4, 2019

Ok, so give me an audio file that causes this problem.

@ZeroOneZeroR
Copy link
Author

https://drive.google.com/open?id=1Il0Z8VPHIUsHV-JN8BuIaLhHnFF__HBD

@ZeroOneZeroR
Copy link
Author

Did you find???

saudet added a commit that referenced this issue Apr 7, 2019
@saudet
Copy link
Member

saudet commented Apr 7, 2019

I see what the issue is. For audio filters, we need to add asetpts=N instead of setpts=N. I've updated that in commit bfaeb87 so that we don't need to add it manually and afade is working fine now.

Please give it a try with the snapshots: http://bytedeco.org/builds/

@ZeroOneZeroR
Copy link
Author

new FFmpegFrameFilter("asetpts=N,afade=t=out:st=0:d=1",audioFrameGrabber.getAudioChannels())
will this work with my current biuld???

@saudet
Copy link
Member

saudet commented Apr 8, 2019 via email

@ZeroOneZeroR
Copy link
Author

ZeroOneZeroR commented Apr 8, 2019

this is working...but i have questions...... Will i have to push and pull all the audio frames to the filter to get expected fade effect between certain duration ??? or Can i push only the certain frames that required to be affected??? Actually how does filter know which frames should get effect according to "st=0:d=1"?

@saudet
Copy link
Member

saudet commented Apr 8, 2019

That's what "setpts" and "asetpts" are for, they set the timestamps according to the number of frames/samples you've pushed: https://ffmpeg.org/ffmpeg-filters.html#setpts_002c-asetpts

@ZeroOneZeroR
Copy link
Author

oooooh, thanks a lot ....

yinmingjun pushed a commit to yinmingjun/javacv that referenced this issue May 24, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants