Steady-Entertainment's avatar

laravel FFMPEG

Hey guys this is another question about FFMPEG :)

I am getting the error encoding failed for a file which I generated with laravel facade UploadedFile

/** @test */

    public function can_upload_video()
    {

        $sizeInKilobytes = 100000;

        $file = UploadedFile::fake()->create(
            'video.mp4', $sizeInKilobytes, 'video/mp4'
        );

        Storage::fake('videos_disk');

        $this->actingAs(User::factory()->create());

        Livewire::test(Create::class)
            ->set('title', 'Testvideo333')
            ->set('video', $file)
            ->call('upload');

        dd(Storage::disk('videos_disk')->allFiles());
    }

If I upload real files it works and the files get transcoded to .m3u8 playlists

<?php

namespace App\Jobs;

use FFMpeg\Coordinate\Dimension;
use App\Models\Video;
use Carbon\Carbon;
use FFMpeg\Format\Video\X264;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg;
use Illuminate\Support\Facades\Storage;

class ConvertVideoForStreaming implements ShouldQueue
{
 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $video;

    /**
     * Create a new job instance.
     *
     * @param Video $video
     */
    public function __construct(Video $video)
    {
        $this->video = $video;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $m3u8 = $this->video->id.'.m3u8';

        // create some video formats...
//        $lowBitrateFormat  = (new X264('aac', 'libx264'))->setKiloBitrate(500);
        $midBitrateFormat  = (new X264('aac'))->setKiloBitrate(1000);
//        $highBitrateFormat  = (new X264('aac'))->setKiloBitrate(3000);

        // open the uploaded video from the right disk...
        FFMpeg::fromDisk($this->video->disk)
            ->open($this->video->path)

        // call the 'exportForHLS' method and specify the disk to which we want to export...
            ->exportForHLS()
            ->toDisk('streamable_videos')

        // we'll add different formats so the stream will play smoothly
        // with all kinds of internet connections...
//            ->addFormat($lowBitrateFormat)
            ->addFormat($midBitrateFormat)
//            ->addFormat($highBitrateFormat)

        // call the 'save' method with a filename...
            ->save($m3u8);

        $streaming_path = secure_url('videos/'.$m3u8);
        // update the database so we know the convertion is done!
        $this->video->update([
            'converted_for_streaming_at' => Carbon::now(),
            'streaming_path' => $streaming_path,
        ]);
    }
}

but when I run the test I get the following error:

ProtoneMedia\LaravelFFMpeg\Exporters\EncodingException : Encoding failed
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/EncodingException.php:12
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/MediaExporter.php:171
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/MediaExporter.php:129
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/HLSExporter.php:174
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Collections/Traits/EnumeratesValues.php:692
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/HLSExporter.php:184
 /Users/reniar/code/OfflineJetstream/app/Jobs/ConvertVideoForStreaming.php:63
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:36
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Util.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:93
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Container.php:610
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:132
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:96
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:98
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:67
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php:98
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php:43
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:251
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:227
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:77
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Bus/DispatchesJobs.php:17
 /Users/reniar/code/OfflineJetstream/app/Http/Livewire/Create.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:36
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Util.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:93
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/ComponentConcerns/HandlesActions.php:138
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/HydrationMiddleware/PerformActionCalls.php:19
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/LifecycleManager.php:70
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Connection/ConnectionHandler.php:12
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Controllers/HttpConnectionHandler.php:13
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:48
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Route.php:254
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Route.php:197
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:692
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:694
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:669
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:635
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:624
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:166
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:141
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:110
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:508
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:184
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/MakesHttpRequestsWrapper.php:29
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:185
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:173
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:134
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:36
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:30
 /Users/reniar/code/OfflineJetstream/tests/Feature/CreateTest.php:45
 
 Caused by
 Alchemy\BinaryDriver\Exception\ExecutionFailureException: ffmpeg failed to execute command '/usr/local/bin/ffmpeg' '-y' '-threads' '12' '-i' '/Users/reniar/code/OfflineJetstream/storage/framework/testing/disks/videos_disk/7KncBJNXbXPRQNlpZS5dbSUrTYJBJhGIAnJy4stt.mp4' '-map' '0' '-vcodec' 'libx264' '-b:v' '1000k' '-g' '48' '-hls_playlist_type' 'vod' '-hls_time' '10' '-hls_segment_filename' '/Users/reniar/code/OfflineJetstream/storage/app/streamable_videos/1_0_1000_%05d.ts' '-acodec' 'aac' '-b:a' '128k' '/Users/reniar/code/OfflineJetstream/storage/app/streamable_videos/1_0_1000.m3u8':
 
 Error Output:
 
  ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
   built with Apple clang version 12.0.0 (clang-1200.0.32.27)
   configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
   libavutil      56. 51.100 / 56. 51.100
   libavcodec     58. 91.100 / 58. 91.100
   libavformat    58. 45.100 / 58. 45.100
   libavdevice    58. 10.100 / 58. 10.100
   libavfilter     7. 85.100 /  7. 85.100
   libavresample   4.  0.  0 /  4.  0.  0
   libswscale      5.  7.100 /  5.  7.100
   libswresample   3.  7.100 /  3.  7.100
   libpostproc    55.  7.100 / 55.  7.100
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd3ce809000] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd3ce809000] moov atom not found
 /Users/reniar/code/OfflineJetstream/storage/framework/testing/disks/videos_disk/7KncBJNXbXPRQNlpZS5dbSUrTYJBJhGIAnJy4stt.mp4: Invalid data found when processing input
 
 
 /Users/reniar/code/OfflineJetstream/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php:95
 /Users/reniar/code/OfflineJetstream/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php:73
 /Users/reniar/code/OfflineJetstream/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php:207
 /Users/reniar/code/OfflineJetstream/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php:136
 /Users/reniar/code/OfflineJetstream/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php:237
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:23
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Drivers/PHPFFMpeg.php:175
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/MediaExporter.php:169
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/MediaExporter.php:129
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/HLSExporter.php:174
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Collections/Traits/EnumeratesValues.php:692
 /Users/reniar/code/OfflineJetstream/vendor/pbmedia/laravel-ffmpeg/src/Exporters/HLSExporter.php:184
 /Users/reniar/code/OfflineJetstream/app/Jobs/ConvertVideoForStreaming.php:63
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:36
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Util.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:93
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Container.php:610
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:132
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:96
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:98
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:67
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php:98
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php:43
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:251
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:227
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:77
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Bus/DispatchesJobs.php:17
 /Users/reniar/code/OfflineJetstream/app/Http/Livewire/Create.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:36
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/Util.php:40
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:93
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/ComponentConcerns/HandlesActions.php:138
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/HydrationMiddleware/PerformActionCalls.php:19
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/LifecycleManager.php:70
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Connection/ConnectionHandler.php:12
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Controllers/HttpConnectionHandler.php:13
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:48
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Route.php:254
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Route.php:197
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:692
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:694
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:669
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:635
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Routing/Router.php:624
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:166
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:141
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:110
 /Users/reniar/code/OfflineJetstream/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:508
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:184
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/MakesHttpRequestsWrapper.php:29
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:185
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/TestableLivewire.php:173
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:134
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:36
 /Users/reniar/code/OfflineJetstream/vendor/livewire/livewire/src/Testing/Concerns/MakesCallsToComponent.php:30
 /Users/reniar/code/OfflineJetstream/tests/Feature/CreateTest.php:45
0 likes
3 replies
Tray2's avatar

You will have to mock the encode because it says that the file is invalid which it is since it's not a proper video file.

Invalid data found when processing input

Or somehow upload a real file in your test which is a bad idea since tests should be fast and the re-encode will take time.

You might get away with doing something like

$file = file("./testfile.mp4");

Or maybe even just giving it the path to the file.

Steady-Entertainment's avatar

hmmm thanks tray2 but that doesn't help :(

It used to work with the UploadFile facade but now something changes and I tried your way but that fails :(

Please or to participate in this conversation.