ffmpeg filter_complex na hospedagem compartilhada, onde a segmentação é limitada

1

(Disclaimer: Eu sou bom em PHP, mas não estou familiarizado com ffmpeg ou linhas de comando em geral, então todo o meu código é copiado da Internet)

Estou usando uma hospedagem compartilhada com o ffmpeg ativado (versão 2.6.8).

Para fazer com que qualquer comando ffmpeg funcione, eu preciso adicionar -threads 1 no comando. Tudo funcionou bem até o momento em que eu precisei usar o usuário filter_complex .

Por exemplo, este comando:

ffmpeg -y -i "audio_1.mp3" -i "audio_2.mp3" -threads 1 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map [a] -c:a libfdk_aac "test5.mp3" 2>&1

... deve sobrepor dois arquivos MP3, mas resulta nessa saída:

Array (
    [0] => ffmpeg version 2.6.8 Copyright (c) 2000-2016 the FFmpeg developers
    [1] =>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
    [2] =>   configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libdc1394 --enable-libfaac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
    [3] =>   libavutil      54. 20.100 / 54. 20.100
    [4] =>   libavcodec     56. 26.100 / 56. 26.100
    [5] =>   libavformat    56. 25.101 / 56. 25.101
    [6] =>   libavdevice    56.  4.100 / 56.  4.100
    [7] =>   libavfilter     5. 11.102 /  5. 11.102
    [8] =>   libavresample   2.  1.  0 /  2.  1.  0
    [9] =>   libswscale      3.  1.101 /  3.  1.101
    [10] =>   libswresample   1.  1.100 /  1.  1.100
    [11] =>   libpostproc    53.  3.100 / 53.  3.100
    [12] => Input #0, mp3, from 'audio_1.mp3':
    [13] =>   Metadata:
    [14] =>     encoder         : Lavf54.21.100
    [15] =>   Duration: 00:00:04.10, start: 0.023021, bitrate: 64 kb/s
    [16] =>     Stream #0:0: Audio: mp3, 48000 Hz, mono, s16p, 64 kb/s
    [17] => Input #1, mp3, from 'audio_2.mp3':
    [18] =>   Metadata:
    [19] =>     encoder         : Lavf54.21.100
    [20] =>   Duration: 00:00:10.25, start: 0.023021, bitrate: 64 kb/s
    [21] =>     Stream #1:0: Audio: mp3, 48000 Hz, mono, s16p, 64 kb/s
    [22] => [AVFilterGraph @ 0x21748a0] Error initializing threading.
    [23] => [AVFilterGraph @ 0x21748a0] Error creating filter 'amerge'
    [24] => Error configuring filters.
)

Encontrei minúsculas partículas de informação on-line sobre -filter_threads 1 e -filter_complex_threads 1 e tentei inseri-las em vários locais no comando - o erro é sempre

Unrecognized option 'filter_threads'.
Error splitting the argument list: Option not found

ou

Unrecognized option 'filter_complex_threads'.
Error splitting the argument list: Option not found

Falei com o suporte ao host e eles disseram que o comando deve estar errado, mas tudo que eu tento com filter_complex falha devido ao encadeamento.

Minha lista de filtros ( ffmpeg -filters ) mostra:

Array
(
    [0] => Filters:
    [1] =>   T.. = Timeline support
    [2] =>   .S. = Slice threading
    [3] =>   ..C = Commmand support
    [4] =>   A = Audio input/output
    [5] =>   V = Video input/output
    [6] =>   N = Dynamic number and/or type of input/output
    [7] =>   | = Source or sink filter
    [8] =>  T.. adelay           A->A       Delay one or more audio channels.
    [9] =>  ... aecho            A->A       Add echoing to the audio.
    [10] =>  ... aeval            A->A       Filter audio signal according to a specified expression.
    [11] =>  T.. afade            A->A       Fade in/out input audio.
    [12] =>  ... aformat          A->A       Convert the input audio to one of the specified formats.
    [13] =>  ... ainterleave      N->A       Temporally interleave audio inputs.
    [14] =>  ... allpass          A->A       Apply a two-pole all-pass filter.
    [15] =>  ... amerge           N->A       Merge two or more audio streams into a single multi-channel stream.
    [16] =>  ... amix             N->A       Audio mixing.
    [17] =>  ... anull            A->A       Pass the source unchanged to the output.
    [18] =>  T.. apad             A->A       Pad audio with silence.
    [19] =>  ... aperms           A->A       Set permissions for the output audio frame.
    [20] =>  ... aphaser          A->A       Add a phasing effect to the audio.
    [21] =>  ... aresample        A->A       Resample audio data.
    [22] =>  ... aselect          A->N       Select audio frames to pass in output.
    [23] =>  ... asendcmd         A->A       Send commands to filters.
    [24] =>  ... asetnsamples     A->A       Set the number of samples for each output audio frames.
    [25] =>  ... asetpts          A->A       Set PTS for the output audio frame.
    [26] =>  ... asetrate         A->A       Change the sample rate without altering the data.
    [27] =>  ... asettb           A->A       Set timebase for the audio output link.
    [28] =>  ... ashowinfo        A->A       Show textual information for each audio frame.
    [29] =>  ... asplit           A->N       Pass on the audio input to N audio outputs.
    [30] =>  ... astats           A->A       Show time domain statistics about audio frames.
    [31] =>  ... astreamsync      AA->AA     Copy two streams of audio data in a configurable order.
    [32] =>  ... asyncts          A->A       Sync audio data to timestamps
    [33] =>  ..C atempo           A->A       Adjust audio tempo.
    [34] =>  ... atrim            A->A       Pick one continuous section from the input, drop the rest.
    [35] =>  ... bandpass         A->A       Apply a two-pole Butterworth band-pass filter.
    [36] =>  ... bandreject       A->A       Apply a two-pole Butterworth band-reject filter.
    [37] =>  ... bass             A->A       Boost or cut lower frequencies.
    [38] =>  ... biquad           A->A       Apply a biquad IIR filter with the given coefficients.
    [39] =>  ... channelmap       A->A       Remap audio channels.
    [40] =>  ... channelsplit     A->N       Split audio into per-channel streams.
    [41] =>  ... compand          A->A       Compress or expand audio dynamic range.
    [42] =>  T.. dcshift          A->A       Apply a DC shift to the audio.
    [43] =>  ... earwax           A->A       Widen the stereo image.
    [44] =>  ... ebur128          A->N       EBU R128 scanner.
    [45] =>  ... equalizer        A->A       Apply two-pole peaking equalization (EQ) filter.
    [46] =>  ... flanger          A->A       Apply a flanging effect to the audio.
    [47] =>  ... highpass         A->A       Apply a high-pass filter with 3dB point frequency.
    [48] =>  ... join             N->A       Join multiple audio streams into multi-channel output.
    [49] =>  ..C ladspa           N->A       Apply LADSPA effect.
    [50] =>  ... lowpass          A->A       Apply a low-pass filter with 3dB point frequency.
    [51] =>  ... pan              A->A       Remix channels with coefficients (panning).
    [52] =>  ... replaygain       A->A       ReplayGain scanner.
    [53] =>  ... resample         A->A       Audio resampling and conversion.
    [54] =>  ... silencedetect    A->A       Detect silence.
    [55] =>  ... silenceremove    A->A       Remove silence.
    [56] =>  ... treble           A->A       Boost or cut upper frequencies.
    [57] =>  T.C volume           A->A       Change input volume.
    [58] =>  ... volumedetect     A->A       Detect audio volume.
    [59] =>  ... aevalsrc         |->A       Generate an audio signal generated by an expression.
    [60] =>  ... anullsrc         |->A       Null audio source, return empty audio frames.
    [61] =>  ... sine             |->A       Generate sine wave audio signal.
    [62] =>  ... anullsink        A->|       Do absolutely nothing with the input audio.
    [63] =>  ... alphaextract     V->N       Extract an alpha channel as a grayscale image component.
    [64] =>  ... alphamerge       VV->V      Copy the luma value of the second input into the alpha channel of the first input.
    [65] =>  ... ass              V->V       Render ASS subtitles onto input video using the libass library.
    [66] =>  T.. bbox             V->V       Compute bounding box for each frame.
    [67] =>  ... blackdetect      V->V       Detect video intervals that are (almost) black.
    [68] =>  ... blackframe       V->V       Detect frames that are (almost) black.
    [69] =>  TS. blend            VV->V      Blend two video frames into each other.
    [70] =>  T.. boxblur          V->V       Blur the input.
    [71] =>  T.. codecview        V->V       Visualize information about some codecs
    [72] =>  T.. colorbalance     V->V       Adjust the color balance.
    [73] =>  T.. colorchannelmixer V->V       Adjust colors by mixing color channels.
    [74] =>  T.. colorlevels      V->V       Adjust the color levels.
    [75] =>  T.. colormatrix      V->V       Convert color matrix.
    [76] =>  ... copy             V->V       Copy the input video unchanged to the output.
    [77] =>  ... crop             V->V       Crop the input video.
    [78] =>  T.. cropdetect       V->V       Auto-detect crop size.
    [79] =>  TS. curves           V->V       Adjust components curves.
    [80] =>  TS. dctdnoiz         V->V       Denoise frames using 2D DCT.
    [81] =>  ... decimate         N->V       Decimate frames (post field matching filter).
    [82] =>  ... dejudder         V->V       Remove judder produced by pullup.
    [83] =>  T.. delogo           V->V       Remove logo from input video.
    [84] =>  ... deshake          V->V       Stabilize shaky video.
    [85] =>  T.. drawbox          V->V       Draw a colored box on the input video.
    [86] =>  T.. drawgrid         V->V       Draw a colored grid on the input video.
    [87] =>  T.C drawtext         V->V       Draw text on top of video frames using libfreetype library.
    [88] =>  T.. edgedetect       V->V       Detect and draw edge.
    [89] =>  ... elbg             V->V       Apply posterize effect, using the ELBG algorithm.
    [90] =>  ..C eq               V->V       Adjust brightness, contrast, gamma, and saturation.
    [91] =>  ... extractplanes    V->N       Extract planes as grayscale frames.
    [92] =>  .S. fade             V->V       Fade in/out input video.
    [93] =>  ... field            V->V       Extract a field from the input video.
    [94] =>  ... fieldmatch       N->V       Field matching for inverse telecine.
    [95] =>  T.. fieldorder       V->V       Set the field order.
    [96] =>  ... format           V->V       Convert the input video to one of the specified pixel formats.
    [97] =>  ... fps              V->V       Force constant framerate.
    [98] =>  ... framepack        VV->V      Generate a frame packed stereoscopic video.
    [99] =>  T.. framestep        V->V       Select one frame every N frames.
    [100] =>  T.. fspp             V->V       Apply Fast Simple Post-processing filter.
    [101] =>  T.. geq              V->V       Apply generic equation to each pixel.
    [102] =>  T.. gradfun          V->V       Debands video quickly using gradients.
    [103] =>  TS. haldclut         VV->V      Adjust colors using a Hald CLUT.
    [104] =>  .S. hflip            V->V       Horizontally flip the input video.
    [105] =>  T.. histeq           V->V       Apply global color histogram equalization.
    [106] =>  ... histogram        V->V       Compute and draw a histogram.
    [107] =>  T.. hqdn3d           V->V       Apply a High Quality 3D Denoiser.
    [108] =>  .S. hqx              V->V       Scale the input by 2, 3 or 4 using the hq*x magnification algorithm.
    [109] =>  T.C hue              V->V       Adjust the hue and saturation of the input video.
    [110] =>  ... idet             V->V       Interlace detect Filter.
    [111] =>  T.. il               V->V       Deinterleave or interleave fields.
    [112] =>  ... interlace        V->V       Convert progressive video into interlaced.
    [113] =>  ... interleave       N->V       Temporally interleave video inputs.
    [114] =>  ... kerndeint        V->V       Apply kernel deinterlacing to the input.
    [115] =>  .S. lenscorrection   V->V       Rectify the image by correcting for lens distortion.
    [116] =>  TS. lut3d            V->V       Adjust colors using a 3D LUT.
    [117] =>  T.. lut              V->V       Compute and apply a lookup table to the RGB/YUV input video.
    [118] =>  T.. lutrgb           V->V       Compute and apply a lookup table to the RGB input video.
    [119] =>  T.. lutyuv           V->V       Compute and apply a lookup table to the YUV input video.
    [120] =>  ... mcdeint          V->V       Apply motion compensating deinterlacing.
    [121] =>  ... mergeplanes      N->V       Merge planes.
    [122] =>  ... mpdecimate       V->V       Remove near-duplicate frames.
    [123] =>  T.. negate           V->V       Negate input video.
    [124] =>  ... noformat         V->V       Force libavfilter not to use any of the specified pixel formats for the input to the next filter.
    [125] =>  TS. noise            V->V       Add noise.
    [126] =>  ... null             V->V       Pass the source unchanged to the output.
    [127] =>  T.C overlay          VV->V      Overlay a video source on top of the input.
    [128] =>  T.. owdenoise        V->V       Denoise using wavelets.
    [129] =>  ... pad              V->V       Pad the input video.
    [130] =>  ... palettegen       V->V       Find the optimal palette for a given stream.
    [131] =>  ... paletteuse       VV->V      Use a palette to downsample an input video stream.
    [132] =>  ... perms            V->V       Set permissions for the output video frame.
    [133] =>  TS. perspective      V->V       Correct the perspective of video.
    [134] =>  T.. phase            V->V       Phase shift fields.
    [135] =>  ... pixdesctest      V->V       Test pixel format definitions.
    [136] =>  T.C pp               V->V       Filter video using libpostproc.
    [137] =>  T.. pp7              V->V       Apply Postprocessing 7 filter.
    [138] =>  ... psnr             VV->V      Calculate the PSNR between two video streams.
    [139] =>  ... pullup           V->V       Pullup from field sequence to frames.
    [140] =>  T.. qp               V->V       Change video quantization parameters.
    [141] =>  T.. removelogo       V->V       Remove a TV logo based on a mask image.
    [142] =>  ... repeatfields     V->V       Hard repeat fields based on MPEG repeat field flag.
    [143] =>  TSC rotate           V->V       Rotate the input image.
    [144] =>  T.. sab              V->V       Apply shape adaptive blur.
    [145] =>  ... scale            V->V       Scale the input video size and/or convert the image format.
    [146] =>  ... select           V->N       Select video frames to pass in output.
    [147] =>  ... sendcmd          V->V       Send commands to filters.
    [148] =>  ... separatefields   V->V       Split input video frames into fields.
    [149] =>  ... setdar           V->V       Set the frame display aspect ratio.
    [150] =>  ... setfield         V->V       Force field for the output video frame.
    [151] =>  ... setpts           V->V       Set PTS for the output video frame.
    [152] =>  ... setsar           V->V       Set the pixel sample aspect ratio.
    [153] =>  ... settb            V->V       Set timebase for the video output link.
    [154] =>  ... showinfo         V->V       Show textual information for each video frame.
    [155] =>  T.. showpalette      V->V       Display frame palette
    [156] =>  ... shuffleplanes    V->V       Shuffle video planes
    [157] =>  .S. signalstats      V->V       Generate statistics from video analysis.
    [158] =>  T.. smartblur        V->V       Blur the input video without impacting the outlines.
    [159] =>  ... split            V->N       Pass on the input to N video outputs.
    [160] =>  T.C spp              V->V       Apply a simple post processing filter.
    [161] =>  ... stereo3d         V->V       Convert video stereoscopic 3D view.
    [162] =>  ... subtitles        V->V       Render text subtitles onto input video using the libass library.
    [163] =>  ... super2xsai       V->V       Scale the input by 2x using the Super2xSaI pixel art algorithm.
    [164] =>  ... swapuv           V->V       Swap U and V components.
    [165] =>  .S. tblend           V->V       Blend successive frames.
    [166] =>  ... telecine         V->V       Apply a telecine pattern.
    [167] =>  ... thumbnail        V->V       Select the most representative frame in a given sequence of consecutive frames.
    [168] =>  ... tile             V->V       Tile several successive frames together.
    [169] =>  ... tinterlace       V->V       Perform temporal field interlacing.
    [170] =>  .S. transpose        V->V       Transpose input video.
    [171] =>  ... trim             V->V       Pick one continuous section from the input, drop the rest.
    [172] =>  T.. unsharp          V->V       Sharpen or blur the input video.
    [173] =>  T.. uspp             V->V       Apply Ultra Simple / Slow Post-processing filter.
    [174] =>  ... vflip            V->V       Flip the input video vertically.
    [175] =>  T.. vignette         V->V       Make or reverse a vignette effect.
    [176] =>  T.. w3fdif           V->V       Apply Martin Weston three field deinterlace.
    [177] =>  .S. xbr              V->V       Scale the input using xBR algorithm.
    [178] =>  TS. yadif            V->V       Deinterlace the input image.
    [179] =>  T.. zoompan          V->V       Apply Zoom & Pan effect.
    [180] =>  ... cellauto         |->V       Create pattern generated by an elementary cellular automaton.
    [181] =>  ..C color            |->V       Provide an uniformly colored input.
    [182] =>  ... haldclutsrc      |->V       Provide an identity Hald CLUT.
    [183] =>  ... life             |->V       Create life.
    [184] =>  ... mandelbrot       |->V       Render a Mandelbrot fractal.
    [185] =>  ... mptestsrc        |->V       Generate various test pattern.
    [186] =>  ... nullsrc          |->V       Null video source, return unprocessed video frames.
    [187] =>  ... rgbtestsrc       |->V       Generate RGB test pattern.
    [188] =>  ... smptebars        |->V       Generate SMPTE color bars.
    [189] =>  ... smptehdbars      |->V       Generate SMPTE HD color bars.
    [190] =>  ... testsrc          |->V       Generate test pattern.
    [191] =>  ... nullsink         V->|       Do absolutely nothing with the input video.
    [192] =>  ... avectorscope     A->V       Convert input audio to vectorscope video output.
    [193] =>  ... concat           N->N       Concatenate audio and video streams.
    [194] =>  ... showcqt          A->V       Convert input audio to a CQT (Constant Q Transform) spectrum video output.
    [195] =>  ... showspectrum     A->V       Convert input audio to a spectrum video output.
    [196] =>  ... showwaves        A->V       Convert input audio to a video output.
    [197] =>  ... amovie           |->N       Read audio from a movie source.
    [198] =>  ... movie            |->N       Read from a movie source.
    [199] =>  ... ffbuffersink     V->|       Buffer video frames, and make them available to the end of the filter graph.
    [200] =>  ... ffabuffersink    A->|       Buffer audio frames, and make them available to the end of the filter graph.
    [201] =>  ... abuffer          |->A       Buffer audio frames, and make them accessible to the filterchain.
    [202] =>  ... buffer           |->V       Buffer video frames, and make them accessible to the filterchain.
    [203] =>  ... abuffersink      A->|       Buffer audio frames, and make them available to the end of the filter graph.
    [204] =>  ... buffersink       V->|       Buffer video frames, and make them available to the end of the filter graph.
    [205] =>  ... afifo            A->A       Buffer input frames and send them when they are requested.
    [206] =>  ... fifo             V->V       Buffer input images and send them when they are requested.
)

... que mostra amix (e amerge que eu também estou experimentando), mas não complex (não é? Eu não sei).

Agora não sei se:

(a) Meu comando está errado

(b) A versão do ffmpeg é muito antiga para suportar filtros complexos

(c) A configuração do servidor precisa ser alterada

Ajuda?!

    
por Stuart Pinfold 02.05.2018 / 13:31

0 respostas