FFmpeg - inverting one of two audio files and merging them - audio

I want to merge two files with FFmpeg, but one with inverted phase.
I've used following command, but It doesn't work.
ffmpeg -i "Song.wav" -i "Vocals.wav" -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0=c0|c1=-c1[a]" -map [a] "Instrumental.wav"
[Parsed_pan_1 # 04c69000] Expected in channel name, got "-c1"
[AVFilterGraph # 04b9bd80] Error initializing filter 'pan' with args 'stereo|c0=c0|c1=-c1'
Error initializing complex filters.
Invalid argument
I've also tried multiple variants of c0<c0-c1|c1<c1-c0, etc.
What command should I use? Or maybe there's an easier workaround?

Related

How to mimic Audacity's "truncate silence" with ffmpeg "silenceremove" filter

I want to remove completely silence parts from wav files with ffmpeg.
Input wav can be like :
I am using the following ffmpeg command to remove silence part ffmpeg -i input.wav -af silenceremove=stop_periods=-1:stop_duration=0.2:stop_threshold=-45dB output.wav because I understand from the doc that it will remove all silence parts longer than 0.2 s (silence being below -45dB).
But I get that where silence part has only been reduced to around 0.1 wheras I want it to be 0 (no remaining silence).
In Audacity I will use "truncate audio" filter and choose the above parameters to detect silence and in the action part I will choose to truncate to 0: .
This will yield to what I want (ie an audio with no silence part remaining):
Searching on the internet only lead me to what I already do.
So how can I reproduce the output I get from Audacity "Truncate Silence" filter with ffmpeg and remove all silence parts from audio ?
Edit: The output from silencedetect filter is correct: ffmpeg -i input.wav -af silencedetect=0.2:n=-45dB -f null - detects exactly what audacity detects.
Thanks in advance for your help
It looks like the equivalent command to AUdacity's truncate silence behaviour is the following (in bold what is added):
ffmpeg -i input.wav -af silenceremove=start_periods=1:stop_periods=-1:stop_duration=0.2:start_threshold=-45dB:stop_threshold=-45dB output.wav
I am not sure why adding those 2 parameters leads to the expected behaviour but it works although for some files silenceremove can remove more parts than Audacity / silencedetect detect.

FFmpeg Option 'mix' not found while using arnndn filter

I am attempting to use FFmpegs arnndn filter (https://ffmpeg.org/ffmpeg-filters.html#arnndn) to denoise audio samples. I am able to run this command ffmpeg.exe -i "input.mov" -af arnndn=m="bd.rnnn" "output.mov" and I receive a denoised output, however when I add the mix option (for example: ffmpeg.exe -i "input.mov" -af arnndn=m="bd.rnnn":mix=1 "output.mov") I receive an error that says "Option 'mix' not found". Am I passing the mix value incorrectly or is this filter not working properly?

Removing / Overlaying logo on mp4 video format with ffmpeg on linux

I'm trying to remove a logo from an .mp4 video file with ffmpeg on linux machine without re-encoding (for preserving the same quality) with the following command:
ffmpeg -i input.mp4 -vf delogo=x=270:y=190:w=40:h=40 -c:a copy output.mp4
and it gives me the following errors:
Unrecognized option 'vf'
then a new error came up:
Unable to find a suitable output format for 'delogo=x=270:y=190:w=40:h=40'
ffmpeg is always updating and it seems that they change command line arguments a lot so any material or tutorial I find online seems to get outdated quickly ...
I reviewed the documentation but can't get it to work, I think I'm missing something...?
So: What is the correct command line in linux shell? Also, how to view or find out the exact coordinates of the area to be removed before actually removing the logo? And how can I overlay a solid color in a certain area instead of removing the logo transparently?
Unrecognized option 'vf'
What version of ffmpeg? (You should be able to tell from the output of running just "ffmpeg" without arguments.) My guess is that you have a terribly old version, "-vf" is still current syntax.
put the delogo phrase in quotation marks: "delogo=x=270:y=190:w=40:h=40"

how to merge any video to my intro using ffmpeg

I have a single intro video. I want to add the intro using ffmpeg or a similar program in the beggining of the users uploaded video (and yes I do need to merge them in one file, so it would be possible to download it later)
I`ve been searching internet and it suggests to convert both (intro and the other video) in to .mpg format.
OK, so far so good, but now when I try to join them together I get
[mpeg4 # 0x5547c60]Invalid and inefficient vfw-avi packed B frames detected
So I`m guessing it is because of something being different in both videos, like frame rate or size.
The worst thing is users are allowed to upload videos in almost any formats, also 240p-720p quality, so there is not one default size to convert the intro video into.
How could this be done?
Your intro video should match the resolution of the user videos, you should have as many intro-videos in as many resolutions as the user videos. Or convert all the user videos to a single resolution to match that of the intro video.Are you doing intro.mpg + user.mpg to combine the videos? Is this giving the above error?
Use ffmpeg:
ffmpeg -i 'concat:input1|input2' -codec copy output
or
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mkv
or
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
$ ffmpeg -f concat -i mylist.txt -c copy output
Source: Concatenate two mp4 files using ffmpeg

Delay audio for a few seconds at the start of audio files (using ffmpeg)

I have been trying to get lots of wav files delayed by 2 seconds at the start using ffmpeg. And so far, even though I have read the manual, I was not able to get it working. Here is my command:
for %%A in (*.wav) do (
ffmpeg -i "%%A" -itsoffset 00:00:02 "%%~NA"1.wav )
And nothing is being changed. Files are simply getting copied. I also tried the same with mp3 files. I also tried mkv and avi (to make sure it was not a container writing issue), but it gives the same result also.
Command is same here and here, but it does not work. Please, help.
You must put -itsoffset BEFORE you specify input. So:
ffmpeg -itsoffset 00:00:02 -i "%%A" "%%~NA"1.wav
Changing the input time offset like that isn't going to do anything noticeable for a single stream, it's meant for fixing out-of-sync issues between audio and video streams.
Do you want to tack on two seconds of silence at the start? If so, one simple way that'd work (although it may feel a bit hackish) is to simply tack on a 2 second WAV full of silence, before the actual input. This would be accomplished by simply adding another -i option before the actual file:
ffmpeg -i 2secsilence.wav -i "%%A" "%%~NA"1.wav
I know this question is over 9 months old, but I came across it and wanted to add some more information about '-itsoffset'. From the ffmpeg trouble ticket pages (https://ffmpeg.org/trac/ffmpeg/ticket/1349):
This command should display file1 content one second earlier than file2 content:
ffmpeg -itsoffset -1 -i file1.ts -i file2.ts -vcodec copy -acodec copy -map 0:0 -map 1:1 out.ts
1) What I see is that -itsoffset adds or subtracts from all the timestamps (both the video and audio streams) in a file. So this option is only going to be useful when remuxing from separate input files.
2) outfile has expected playback behavior with .ts and .mkv containers.
3) It does not work with .avi (no timestamps, so not a surprise)
4) It does not work with .mp4 container (a bug?)
And that is where this issue stands as of today.

Resources