Recherche avancée

Médias (91)

Autres articles (62)

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

  • Des sites réalisés avec MediaSPIP

    2 mai 2011, par

    Cette page présente quelques-uns des sites fonctionnant sous MediaSPIP.
    Vous pouvez bien entendu ajouter le votre grâce au formulaire en bas de page.

  • Dépôt de média et thèmes par FTP

    31 mai 2013, par

    L’outil MédiaSPIP traite aussi les média transférés par la voie FTP. Si vous préférez déposer par cette voie, récupérez les identifiants d’accès vers votre site MédiaSPIP et utilisez votre client FTP favori.
    Vous trouverez dès le départ les dossiers suivants dans votre espace FTP : config/ : dossier de configuration du site IMG/ : dossier des média déjà traités et en ligne sur le site local/ : répertoire cache du site web themes/ : les thèmes ou les feuilles de style personnalisées tmp/ : dossier de travail (...)

Sur d’autres sites (6205)

  • How to specify a fractional framerate with ffmpeg C/C++ when stitching together images ?

    14 septembre 2022, par Turgut

    I want to specify fractional frame rate's like 23.797 or 59.94 when creating my encoder. Here is how I do it currently :

    


    AVStream* st;
...
st->time_base = (AVRational){1, STREAM_FRAME_RATE };


    


    But looking at ffmpeg's source code at rational.h we can see that AVRational struct takes int's instead of float's. So my 23.797 turns into 23 thus encoding wrong. How can I specify fps with floating numbers ?

    


  • Cryptic `ffmpeg` + Python error : `Cannot find a matching stream for unlabeled input pad 0 on filter Parsed_crop_1`

    5 août 2022, par mattze_frisch

    I want to use ffmpeg with Python in a Jupyter notebook to create a video from 2000 PNG image files generated by matplotlib. I'm on a Windows 7 machine.

    


    The frames are very narrow and high, so I'd like to cut them vertically into seven equal-sized "tiles" using crop and stacked those "tiles" horizontally using hstack, but I'm getting only getting cryptic error messages :

    


    ffmpeg_path = notebook_directory    # Make sure ffmpeg.exe is in notebook directory!&#xA;&#xA;frames_path = &#x27;C:\\Users\\Username\\Desktop&#x27;&#xA;frames_renamed_path = os.path.join(frames_path, &#x27;renamed&#x27;)&#xA;os.chdir(frames_renamed_path)    # Temporarily change current working directory&#xA;&#xA;check_call(&#xA;    [&#xA;        os.path.join(ffmpeg_path, &#x27;ffmpeg&#x27;),&#xA;        &#x27;-y&#x27;,    # Overwrite output files without asking&#xA;        &#x27;-report&#x27;,    # Write logfile to current working directory&#xA;        &#x27;-hwaccel&#x27;, &#x27;cuda&#x27;,    # Use GPU acceleration&#xA;        &#x27;-framerate&#x27;, &#x27;60&#x27;,    # Input frame rate&#xA;        &#x27;-i&#x27;, os.path.join(frames_renamed_path, &#x27;frame%05d.png&#x27;),    # Path to input frames&#xA;        #&#x27;-r&#x27;, &#x27;60&#x27;,    # Output frame rate&#xA;        #&#x27;-vf&#x27;, &#x27;pad=ceil(iw/2)*2:ceil(ih/2)*2&#x27;,    # Pad frames to even pixel numbers (required by many codecs)&#xA;        #&#x27;-pix_fmt&#x27;, &#x27;yuv420p&#x27;,&#xA;        &#x27;-pix_fmt&#x27;, &#x27;rgb32&#x27;,    # Use RGB32 pixel format matching MatPlotLib image output&#xA;        &#x27;-filter_complex&#x27;,    # Cut frames into tiles and rearrange (here: 7 horizontal tiles)&#xA;            &#x27;crop=in_w:in_h/7:0:0[tile_1],&#x27;    # 1st tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*1/7[tile_2],&#x27;    # 2nd tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*2/7[tile_3],&#x27;    # 3rd tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*3/7[tile_4],&#x27;    # 4th tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*4/7[tile_5],&#x27;    # 5th tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*5/7[tile_6],&#x27;    # 6th tile from top&#xA;            &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*6/7[tile_7],&#x27;    # 7th tile from top&#xA;            &#x2B; &#x27;[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7&#x27;,    # Stack tiles horizontally&#xA;        os.path.join(frames_renamed_path, &#x27;video.mp4&#x27;)    # Path to store output video&#xA;    ]&#xA;)&#xA;&#xA;os.chdir(notebook_directory)    # Reset current working directory to notebook directory&#xA;&#xA;---------------------------------------------------------------------------&#xA;CalledProcessError                        Traceback (most recent call last)&#xA;Input In [10], in <cell 9="9">()&#xA;      6 frames_renamed_path = os.path.join(frames_path, &#x27;renamed&#x27;)&#xA;      7 os.chdir(frames_renamed_path)    # Temporarily change current working directory&#xA;----> 9 check_call(&#xA;     10     [&#xA;     11         os.path.join(ffmpeg_path, &#x27;ffmpeg&#x27;),&#xA;     12         &#x27;-y&#x27;,    # Overwrite output files without asking&#xA;     13         &#x27;-report&#x27;,    # Write logfile to current working directory&#xA;     14         &#x27;-hwaccel&#x27;, &#x27;cuda&#x27;,    # Use GPU acceleration&#xA;     15         &#x27;-framerate&#x27;, &#x27;60&#x27;,    # Input frame rate&#xA;     16         &#x27;-i&#x27;, os.path.join(frames_renamed_path, &#x27;frame%05d.png&#x27;),    # Path to input frames&#xA;     17         #&#x27;-pattern_type&#x27;, &#x27;glob&#x27;, &#x27;-i&#x27;, os.path.join(frames_renamed_path, &#x27;*.png&#x27;),    # glob not available in Windows by default&#xA;     18         #&#x27;-r&#x27;, &#x27;60&#x27;,    # Output frame rate&#xA;     19         &#x27;-vf&#x27;, &#x27;pad=ceil(iw/2)*2:ceil(ih/2)*2&#x27;,    # Pad frames to even pixel numbers (required by many codecs)&#xA;     20         #&#x27;-pix_fmt&#x27;, &#x27;yuv420p&#x27;,&#xA;     21         &#x27;-pix_fmt&#x27;, &#x27;rgb32&#x27;,    # Use RGB32 pixel format matching MatPlotLib image output&#xA;     22         &#x27;-filter_complex&#x27;,    # Cut frames into tiles and rearrange (here: 7 horizontal tiles)&#xA;     23             &#x27;crop=in_w:in_h/7:0:0[tile_1],&#x27;    # 1st tile from top&#xA;     24             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*1/7[tile_2],&#x27;    # 2nd tile from top&#xA;     25             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*2/7[tile_3],&#x27;    # 3rd tile from top&#xA;     26             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*3/7[tile_4],&#x27;    # 4th tile from top&#xA;     27             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*4/7[tile_5],&#x27;    # 5th tile from top&#xA;     28             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*5/7[tile_6],&#x27;    # 6th tile from top&#xA;     29             &#x2B; &#x27;crop=in_w:in_h/7:0:in_h*6/7[tile_7],&#x27;    # 7th tile from top&#xA;     30             &#x2B; &#x27;[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7&#x27;,    # Stack tiles horizontally&#xA;     31         os.path.join(frames_renamed_path, &#x27;video.mp4&#x27;)    # Path to store output video&#xA;     32     ]&#xA;     33 )&#xA;     35 os.chdir(notebook_directory)&#xA;&#xA;File C:\Program Files\Python38\lib\subprocess.py:364, in check_call(*popenargs, **kwargs)&#xA;    362     if cmd is None:&#xA;    363         cmd = popenargs[0]&#xA;--> 364     raise CalledProcessError(retcode, cmd)&#xA;    365 return 0&#xA;&#xA;CalledProcessError: Command &#x27;[&#x27;C:\\Users\\Username\\Desktop\\ffmpeg\\ffmpeg&#x27;, &#x27;-y&#x27;, &#x27;-report&#x27;, &#x27;-hwaccel&#x27;, &#x27;cuda&#x27;, &#x27;-framerate&#x27;, &#x27;60&#x27;, &#x27;-i&#x27;, &#x27;C:\\Users\\Username\\Desktop\\renamed\\frame%05d.png&#x27;, &#x27;-vf&#x27;, &#x27;pad=ceil(iw/2)*2:ceil(ih/2)*2&#x27;, &#x27;-pix_fmt&#x27;, &#x27;rgb32&#x27;, &#x27;-filter_complex&#x27;, &#x27;crop=in_w:in_h/7:0:0[tile_1],crop=in_w:in_h/7:0:in_h*1/7[tile_2],crop=in_w:in_h/7:0:in_h*2/7[tile_3],crop=in_w:in_h/7:0:in_h*3/7[tile_4],crop=in_w:in_h/7:0:in_h*4/7[tile_5],crop=in_w:in_h/7:0:in_h*5/7[tile_6],crop=in_w:in_h/7:0:in_h*6/7[tile_7],[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7&#x27;, &#x27;C:\\Users\\Username\\Desktop\\renamed\\video.mp4&#x27;]&#x27; returned non-zero exit status 1.&#xA;</cell>

    &#xA;

    This is the ffmpeg log output (cropped) :

    &#xA;

    ffmpeg started on 2022-08-04 at 01:17:19&#xA;Report written to "ffmpeg-20220804-011719.log"&#xA;Log level: 48&#xA;Command line:&#xA;"C:\\Users\\Username\\Desktop\\ffmpeg\\ffmpeg" -y -report -hwaccel cuda -framerate 60 -i "C:\\Users\\Username\\Desktop\\renamed\\frame%05d.png" -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -pix_fmt rgb32 -filter_complex "crop=in_w:in_h/7:0:0[tile_1],crop=in_w:in_h/7:0:in_h*1/7[tile_2],crop=in_w:in_h/7:0:in_h*2/7[tile_3],crop=in_w:in_h/7:0:in_h*3/7[tile_4],crop=in_w:in_h/7:0:in_h*4/7[tile_5],crop=in_w:in_h/7:0:in_h*5/7[tile_6],crop=in_w:in_h/7:0:in_h*6/7[tile_7],[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7" "C:\\Users\\Username\\Desktop\\renamed\\video.mp4"&#xA;ffmpeg version 2022-07-14-git-882aac99d2-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers&#xA;  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)&#xA;  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --ena  libavutil      57. 29.100 / 57. 29.100&#xA;  libavcodec     59. 38.100 / 59. 38.100&#xA;  libavformat    59. 28.100 / 59. 28.100&#xA;  libavdevice    59.  8.100 / 59.  8.100&#xA;  libavfilter     8. 45.100 /  8. 45.100&#xA;  libswscale      6.  8.100 /  6.  8.100&#xA;  libswresample   4.  8.100 /  4.  8.100&#xA;  libpostproc    56.  7.100 / 56.  7.100&#xA;Splitting the commandline.&#xA;Reading option &#x27;-y&#x27; ... matched as option &#x27;y&#x27; (overwrite output files) with argument &#x27;1&#x27;.&#xA;Reading option &#x27;-report&#x27; ... matched as option &#x27;report&#x27; (generate a report) with argument &#x27;1&#x27;.&#xA;Reading option &#x27;-hwaccel&#x27; ... matched as option &#x27;hwaccel&#x27; (use HW accelerated decoding) with argument &#x27;cuda&#x27;.&#xA;Reading option &#x27;-framerate&#x27; ... matched as AVOption &#x27;framerate&#x27; with argument &#x27;60&#x27;.&#xA;Reading option &#x27;-i&#x27; ... matched as input url with argument &#x27;C:\Users\Username\Desktop\renamed\frame%05d.png&#x27;.&#xA;Reading option &#x27;-vf&#x27; ... matched as option &#x27;vf&#x27; (set video filters) with argument &#x27;pad=ceil(iw/2)*2:ceil(ih/2)*2&#x27;.&#xA;Reading option &#x27;-pix_fmt&#x27; ... matched as option &#x27;pix_fmt&#x27; (set pixel format) with argument &#x27;rgb32&#x27;.&#xA;Reading option &#x27;-filter_complex&#x27; ... matched as option &#x27;filter_complex&#x27; (create a complex filtergraph) with argument &#x27;crop=in_w:in_h/7:0:0[tile_1],crop=in_w:in_h/7:0:in_h*1/7[tile_2],crop=in_w:in_h/7:0:in_h*2/7[tile_3],crop=in_w:in_h/7:0:in_h*3/7[tile_4],crop=in_w:in_h/7:0:in_h*4/7[tile_5],crop=in_w:in_h/7:0:in_h*5/7[tile_6],crop=in_w:in_h/7:0:in_h*6/7[tile_7],[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7&#x27;.&#xA;Reading option &#x27;C:\Users\Username\Desktop\renamed\video.mp4&#x27; ... matched as output url.&#xA;Finished splitting the commandline.&#xA;Parsing a group of options: global .&#xA;Applying option y (overwrite output files) with argument 1.&#xA;Applying option report (generate a report) with argument 1.&#xA;Applying option filter_complex (create a complex filtergraph) with argument crop=in_w:in_h/7:0:0[tile_1],crop=in_w:in_h/7:0:in_h*1/7[tile_2],crop=in_w:in_h/7:0:in_h*2/7[tile_3],crop=in_w:in_h/7:0:in_h*3/7[tile_4],crop=in_w:in_h/7:0:in_h*4/7[tile_5],crop=in_w:in_h/7:0:in_h*5/7[tile_6],crop=in_w:in_h/7:0:in_h*6/7[tile_7],[tile_1][tile_2][tile_3][tile_4][tile_5][tile_6][tile_7]hstack=7.&#xA;Successfully parsed a group of options.&#xA;Parsing a group of options: input url C:\Users\Username\Desktop\renamed\frame%05d.png.&#xA;Applying option hwaccel (use HW accelerated decoding) with argument cuda.&#xA;Successfully parsed a group of options.&#xA;Opening an input file: C:\Users\Username\Desktop\renamed\frame%05d.png.&#xA;[image2 @ 00000000005db0c0] Opening &#x27;C:\Users\Username\Desktop\renamed\frame00000.png&#x27; for reading&#xA;[file @ 00000000005f6c00] Setting default whitelist &#x27;file,crypto,data&#x27;&#xA;[AVIOContext @ 00000000005fed40] Statistics: 28860 bytes read, 0 seeks&#xA;&#xA;&lt;...>&#xA;&#xA;[AVIOContext @ 00000000005fda00] Statistics: 67659 bytes read, 0 seeks&#xA;[image2 @ 00000000005db0c0] Probe buffer size limit of 5000000 bytes reached&#xA;Input #0, image2, from &#x27;C:\Users\Username\Desktop\renamed\frame%05d.png&#x27;:&#xA;  Duration: 00:00:25.00, start: 0.000000, bitrate: N/A&#xA;  Stream #0:0, 80, 1/60: Video: png, rgba(pc), 1200x1857 [SAR 3937:3937 DAR 400:619], 60 fps, 60 tbr, 60 tbn&#xA;Successfully opened the file.&#xA;[Parsed_crop_0 @ 00000000005fdc40] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_0 @ 00000000005fdc40] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_0 @ 00000000005fdc40] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_0 @ 00000000005fdc40] Setting &#x27;y&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_1 @ 0000000000607500] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_1 @ 0000000000607500] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_1 @ 0000000000607500] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_1 @ 0000000000607500] Setting &#x27;y&#x27; to value &#x27;in_h*1/7&#x27;&#xA;[Parsed_crop_2 @ 0000000000607880] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_2 @ 0000000000607880] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_2 @ 0000000000607880] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_2 @ 0000000000607880] Setting &#x27;y&#x27; to value &#x27;in_h*2/7&#x27;&#xA;[Parsed_crop_3 @ 0000000000607c00] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_3 @ 0000000000607c00] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_3 @ 0000000000607c00] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_3 @ 0000000000607c00] Setting &#x27;y&#x27; to value &#x27;in_h*3/7&#x27;&#xA;[Parsed_crop_4 @ 00000000005fda00] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_4 @ 00000000005fda00] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_4 @ 00000000005fda00] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_4 @ 00000000005fda00] Setting &#x27;y&#x27; to value &#x27;in_h*4/7&#x27;&#xA;[Parsed_crop_5 @ 0000000002b8f800] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_5 @ 0000000002b8f800] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_5 @ 0000000002b8f800] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_5 @ 0000000002b8f800] Setting &#x27;y&#x27; to value &#x27;in_h*5/7&#x27;&#xA;[Parsed_crop_6 @ 0000000000607d00] Setting &#x27;out_w&#x27; to value &#x27;in_w&#x27;&#xA;[Parsed_crop_6 @ 0000000000607d00] Setting &#x27;out_h&#x27; to value &#x27;in_h/7&#x27;&#xA;[Parsed_crop_6 @ 0000000000607d00] Setting &#x27;x&#x27; to value &#x27;0&#x27;&#xA;[Parsed_crop_6 @ 0000000000607d00] Setting &#x27;y&#x27; to value &#x27;in_h*6/7&#x27;&#xA;[Parsed_hstack_7 @ 0000000002b8fb80] Setting &#x27;inputs&#x27; to value &#x27;7&#x27;&#xA;Cannot find a matching stream for unlabeled input pad 0 on filter Parsed_crop_1&#xA;

    &#xA;

    What is the problem here ? Also, how does one interpret this cryptic error message at the end of the log output :

    &#xA;

    Cannot find a matching stream for unlabeled input pad 0 on filter Parsed_crop_1

    &#xA;

    E.g. what is input pad 0, why is it unlabeled, and why can't it find a matching stream ?

    &#xA;

    (PS. : Yes, I do have a habit of excessively documenting my code. ^^)

    &#xA;

  • building c++ code into a shared library

    11 avril 2016, par gaurav

    I have some c++ code which i use as shared library in a java application.My c++ code uses some libraries like ffmpeg and boost. and ffmpeg libraries in turn depend on libx264. my first question is - can i build my c++ into a "fat" shared library which contains all the symbols from all libraries used so that on a new machine if i just copy the fat .so file everything works.
    If thats not possible then can you help me fix my current build process. This is what i am doing currently -

    1)on a local VM(ubuntu 64) i compile ffmpeg code using -fPIC flag and install h264 and boost using apt-get commands.
    2) on the same VM i compile my code using make file which looks like this-

    INCLUDES =   -I/opt/ffmpeg/include -I/usr/lib/jvm/java-7-openjdk-   amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux

    LDFLAGS =   -L/home/ubuntu/ffmpeg_shared

    LIBRARIES = -lavformat -lavcodec -lswscale -lavutil -lpthread  -lx264 -lboost_system -lboost_thread -lboost_chrono

    CC = g++ -std=c++11 -fPIC

    all:clean final

    final:Api.o ImageSequence.o OverlayAnimation.o Utils.o ImageFrame.o
    $(CC)  -o final.so Api.o ImageSequence.o OverlayAnimation.o Utils.o  ImageFrame.o $(LDFLAGS) $(LIBRARIES) -shared

    3) on a new machine where java app will run. i install h264 and boost using apt-get commands and copy ffmpeg’s compiled library files to /usr/local/lib.

    4) copy the final.so file to this new machine. but when the java code tries to use the final.so file i see it tries to use wierdly named files. for example - it tries to find libavcodec.so.57 , libavformat.so.57 etc. to fix this i just created a copy of these files ie libavcodec.so copied to libavcodec.so.57.

    5)But these ffmpeg libraries in turn uses a differently named lib264.so file. on my new machine the apt-get command for x264 installed a file named libx264.so.148 but one of ffmpeg libraries is searching for file libx264.so.142 even if i rename this libx264.so file i get new errors where ffmpeg libraries tries to call libx264’s methods which has these numbers attached.

    6) at this time the only working option for me is to bring the c++ code on every new machine and build final.so file locally. this is something i want to avoid since i want to distribute the .so file along with jar file to my clients which they can easily use without having to build and install stuff.