protonemedia / laravel-ffmpeg

This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files.
https://protone.media/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
MIT License
1.63k stars 194 forks source link

Add audio "watermark" to audio file? #329

Closed vendbits closed 3 years ago

vendbits commented 3 years ago

How can I add a looping (short, 2 second) audio clip every 10 seconds during a 3 minute audio song file to serve as a watermark?

Would I use a complex filter?

use FFMpeg\Filters\AdvancedMedia\ComplexFilters;

FFMpeg::open(['song-sample.mp3', 'annoying-watermark.mp3'])
    ->export()
    ->addFilter(function(ComplexFilters $filters) {
        // $filters->watermark(...);
    })

or addFilter with addFormatOutputMapping ?

  FFMpeg::fromDisk('local')
    ->open(['song-sample.mp3', 'annoying-watermark.mp3'])
    ->export()
    ->addFilter('[0:v][1:v]', 'hstack', '[v]')  // $in, $parameters, $out
    ->addFormatOutputMapping(new X264, Media::make('local', 'watermarked_audio.mp3'), ['0:a', '[v]'])
    ->save();

Thank you for a great Laravel package!!

vendbits commented 3 years ago

Alright, I figured it out in less than 23 hours, but I'm not going to share because I'm a jerk. JK :)

Using setAdditionalParameters:

        FFMpeg::fromDisk('audio')
            ->open(['orig.mp3','audio-watermark.mp3'])
            ->export()
            ->toDisk('audio')
            ->inFormat($inFormat)
        ->setAdditionalParameters([
                '-filter_complex', '[0:a]volume=volume=1[aout0];[1:a]volume=volume=2[aout1];[aout1]aloop=loop=-1:size=2e+09,adelay=2000,atrim=start=0:end=2:duration=6[aconcat];[aout0][aconcat]amix=inputs=2:duration=longest:dropout_transition=4 [aout]',  
            ])
        ->addFormatOutputMapping($outFormat, Media::make('audio', 'merged-audio.m4a'), ['[aout]'])
            ->save();
pascalbaljet commented 3 years ago

Glad you found a solution, and thanks for sharing!