Recherche avancée

Médias (1)

Mot : - Tags -/biomaping

Autres articles (105)

  • Encoding and processing into web-friendly formats

    13 avril 2011, par

    MediaSPIP automatically converts uploaded files to internet-compatible formats.
    Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
    Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
    Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
    All uploaded files are stored online in their original format, so you can (...)

  • Ajouter des informations spécifiques aux utilisateurs et autres modifications de comportement liées aux auteurs

    12 avril 2011, par

    La manière la plus simple d’ajouter des informations aux auteurs est d’installer le plugin Inscription3. Il permet également de modifier certains comportements liés aux utilisateurs (référez-vous à sa documentation pour plus d’informations).
    Il est également possible d’ajouter des champs aux auteurs en installant les plugins champs extras 2 et Interface pour champs extras.

  • Contribute to a better visual interface

    13 avril 2011

    MediaSPIP is based on a system of themes and templates. Templates define the placement of information on the page, and can be adapted to a wide range of uses. Themes define the overall graphic appearance of the site.
    Anyone can submit a new graphic theme or template and make it available to the MediaSPIP community.

Sur d’autres sites (9612)

  • H.264 and VP8 for still image coding : WebP ?

    1er octobre 2010, par Dark Shikari — H.264, VP8, google, psychovisual optimizations

    JPEG is a very old lossy image format. By today’s standards, it’s awful compression-wise : practically every video format since the days of MPEG-2 has been able to tie or beat JPEG at its own game. The reasons people haven’t switched to something more modern practically always boil down to a simple one — it’s just not worth the hassle. Even if JPEG can be beaten by a factor of 2, convincing the entire world to change image formats after 20 years is nigh impossible. Furthermore, JPEG is fast, simple, and practically guaranteed to be free of any intellectual property worries. It’s been tried before : JPEG-2000 first, then Microsoft’s JPEG XR, both tried to unseat JPEG. Neither got much of anywhere.

    Now Google is trying to dump yet another image format on us, “WebP”. But really, it’s just a VP8 intra frame. There are some obvious practical problems with this new image format in comparison to JPEG ; it doesn’t even support all of JPEG’s features, let alone many of the much-wanted features JPEG was missing (alpha channel support, lossless support). It only supports 4:2:0 chroma subsampling, while JPEG can handle 4:2:2 and 4:4:4. Google doesn’t seem interested in adding any of these features either.

    But let’s get to the meat and see how these encoders stack up on compressing still images. As I explained in my original analysis, VP8 has the advantage of H.264′s intra prediction, which is one of the primary reasons why H.264 has such an advantage in intra compression. It only has i4x4 and i16x16 modes, not i8x8, so it’s not quite as fancy as H.264′s, but it comes close.

    The test files are all around 155KB ; download them for the exact filesizes. For all three, I did a binary search of quality levels to get the file sizes close. For x264, I encoded with --tune stillimage --preset placebo. For libvpx, I encoded with --best. For JPEG, I encoded with ffmpeg, then applied jpgcrush, a lossless jpeg compressor. I suspect there are better JPEG encoders out there than ffmpeg ; if you have one, feel free to test it and post the results. The source image is the 200th frame of Parkjoy, from derf’s page (fun fact : this video was shot here ! More info on the video here.).

    Files : (x264 [154KB], vp8 [155KB], jpg [156KB])

    Results (decoded to PNG) : (x264, vp8, jpg)

    This seems rather embarrassing for libvpx. Personally I think VP8 looks by far the worst of the bunch, despite JPEG’s blocking. What’s going on here ? VP8 certainly has better entropy coding than JPEG does (by far !). It has better intra prediction (JPEG has just DC prediction). How could VP8 look worse ? Let’s investigate.

    VP8 uses a 4×4 transform, which tends to blur and lose more detail than JPEG’s 8×8 transform. But that alone certainly isn’t enough to create such a dramatic difference. Let’s investigate a hypothesis — that the problem is that libvpx is optimizing for PSNR and ignoring psychovisual considerations when encoding the image… I’ll encode with --tune psnr --preset placebo in x264, turning off all psy optimizations. 

    Files : (x264, optimized for PSNR [154KB]) [Note for the technical people : because adaptive quantization is off, to get the filesize on target I had to use a CQM here.]

    Results (decoded to PNG) : (x264, optimized for PSNR)

    What a blur ! Only somewhat better than VP8, and still worse than JPEG. And that’s using the same encoder and the same level of analysis — the only thing done differently is dropping the psy optimizations. Thus we come back to the conclusion I’ve made over and over on this blog — the encoder matters more than the video format, and good psy optimizations are more important than anything else for compression. libvpx, a much more powerful encoder than ffmpeg’s jpeg encoder, loses because it tries too hard to optimize for PSNR.

    These results raise an obvious question — is Google nuts ? I could understand the push for “WebP” if it was better than JPEG. And sure, technically as a file format it is, and an encoder could be made for it that’s better than JPEG. But note the word “could”. Why announce it now when libvpx is still such an awful encoder ? You’d have to be nuts to try to replace JPEG with this blurry mess as-is. Now, I don’t expect libvpx to be able to compete with x264, the best encoder in the world — but surely it should be able to beat an image format released in 1992 ?

    Earth to Google : make the encoder good first, then promote it as better than the alternatives. The reverse doesn’t work quite as well.

    [155KB]
  • Handling correctly the ffmpeg & ffprobe with php

    29 septembre 2014, par cocco

    Handling correctly the ffmpeg & ffprobe with php

    maybe not relevant final goals :

    1. upload clip with ajax
    2. get ajax info from ffprobe using php as json executing ffprobe once only (no ffmpeg)
    3. handle all calculations with javascript
    4. maybe an extra php script tool that can create gifs, extract frames(thumbs), or a video grid preview
    5. when rdy ajax the conversion info to the final php conversion script executing ffmpeg once only (just the final ffmpeg string.).

    I’m trying to write my own ffmpeg local web video editor that converts all formats to mp4 automatically. As mp4 is the most compatible container now and the h264+aac/+ac3 is also one of the best compressions. I also want to be able to cut, crop, resize, remove streams, add streams and more. I’m stuck on some simple problems :

    1. HOW TO GET THE INFO ?

    I’m using ffprobe to get the file information as json with the following command :

    ffprobe -v quiet -print_format json -show_format -show_streams -show_packets '.$video

    this gives you a lot of information, but some relevant stuff is not always present. I need the duration (in milliseconds),the fps (as a float) and the total frames (as an integer).

    i know that these values can sometimes be found inside this array :

    format.duration //Total duration
    streams[0].duration //Video duration
    streams[1].duration //Audio duration

    streams[0].avg_frame_rate //Average framerate
    streams[0].r_frame_rate //Video framerate

    streams[0].nb_frames //Total frames

    but most of the time nb_frames is missing, also avg_frame_rate differs from r_frame_rate, which is also not always available.

    I know that i could use multiple commands to increase the chance to get the correct values.. but srsly ???

    //fps
    ffmpeg -i INPUT 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
    //duration
    ffmpeg -i INPUT 2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
    //frames
    ffmpeg -i INPUT -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

    I don’t want to execute ffmpeg 3 times to get this information ; I’d prefer to just use ffprobe.

    So... is there an elegant way to get the extra info that is not always present inside the ffprobe output (fps, frames, duration) ???

    In the preview i want to be able to jump correctly to a specific frame (NOT TIME). if the above parameters are aviable i can do that using this command.

    ffmpeg -i INPUT -vf 'select=gte(n\,FRAMENUMBER)' -vframes 1 -f image2 OUTPUT

    using the above command by setting the framenumber to the last frame always returns a black frame.
    if there are 50 frames (for example) the range is 1-50 — correct ? Frame 50 is black, frame 1 is ok, frame 0 returns an error...


    2. WHILE READING THE LOG HOW TO SKIP ERRORS AND DETERMINE IF THE CONVERSION IS FINISHED ?

    I’m able to upload one single video per time (per page) and i can read the current progress from the ffmpeg generated output log until i don’t close the page. more control/multiple conversions would be nice.

    i’m reading the last line of the log with a custom tail function but as this is a log that also includes errors i don’t always get a nice line containing the desidered values. btw to check if the progress is complete i check if the last line CONTAINS the WORD frame ....

    How can i find out when the conversion progress is finished ?

    maybe a way to delete the log with ffmpeg command ??And skip/log the errors ??

    i’m using server sent events to read the log...
    here is the php code

    <?php
    setlocale(LC_CTYPE, "en_US.UTF-8");
    function tailCustom($filepath,$lines=1,$adaptive=true){
    // a custom function to get the last line of a textfile.
    }
    function send($data){
    echo "id: ".time().PHP_EOL;
    echo "data: ".$data.PHP_EOL;
    echo PHP_EOL;
    ob_flush();
    flush();
    }
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    while(true){
    send(tailCustom($_GET['log'].".log"));
    sleep(1);
    }
    ?>

    And here the SSE js

    function startSSE(fn){
    sse=new EventSource("ffmpegProgress.php?log="+encodeURIComponent(fn));
    sse.addEventListener('message',conversionProgress,false);
    }
    function conversionProgress(e){
    if(e.data.substr(0,6)=='frame='){
     inProgress=true;
     var x=e.data.match(/frame=\s*(.*?)\s*fps=\s*(.*?)\s*q=\s*(.*?)\s*size=\s*(.*?)\s*time=\s*(.*?)\s*bitrate=\s*(.*?)\s*$/);
     x.shift();x={frame:x[0]*1,fps:x[1]*1,q:x[2],size:x[3],time:x[4],bitrate:x[5]};
    var elapsedTime = ((new Date().getTime()) - startTime);
    var chunksPerTime = timeString2ms(x.time) / elapsedTime;
    var estimatedTotalTime = duration / chunksPerTime;
    var timeLeftInSeconds = Math.abs(elapsedTime-(estimatedTotalTime*1000));
    var withOneDecimalPlace = Math.round(timeLeftInSeconds * 10) / 10;
     conversion.innerHTML='Time Left: '+ms2TimeString(timeLeftInSeconds).split('.')[0]+'<br />'+
     'Time Left2: '+(ms2TimeString(((frames-x.frame)/x.fps)*1000)+(timeString2ms(x.time)/(duration*1000)*100|0)).split('.')[0]+'<br />'+
     'Estimated Total: '+ms2TimeString(estimatedTotalTime*1000).split('.')[0]+'<br />'+
     'Elapsed Time: '+ms2TimeString(elapsedTime).split('.')[0];
    }else{
     if(inProgress){
      sse.removeEventListener('message',conversionProgress,false);
      sse.close();
      sse=null;
      conversion.textContent='Finished in '+ms2TimeString((new Date().getTime()) - startTime).split('.')[0];
      //delete log/old file??
      inProgress=false;
     }
    }
    }

    EDIT

    HERE IS A SAMPLE OUTPUT after detecting h264 codec in a m2ts with ac3 audio

    As most devices can already read h264 i just need to convert the audio in aac and copy the same audio AC3 as second track. and put everything inside a mp4 container. So that i have a Android/chrome/ios & more browsers compatible file.

    $opt="-map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 libfdk_aac -metadata:s:a:0 language=ita -b:a 128k -ar 48000 -ac 2 -c:a:1 copy -metadata:s:a:1 language=ita -movflags +faststart";

    $i="in.m2ts";
    $o="out.mp4";
    $t="title";
    $y="2014";
    $progress="nameoftheLOG.log";

    $cmd="ffmpeg -y -i ".escapeshellarg($i)." -metadata title=".$t." -metadata date=".$y." ".$opt." ".$o." null >/dev/null 2>".$progress." &amp;";

    if you have any questions about the code or want to see more code just ask...

  • Discord Voice Bot cannot play the audio file

    7 avril 2023, par Jakub Nawrocki

    I tried to write a bot that will join the voice channel and play a audio at 20:00.

    &#xA;

    Currently the bot joins the channel, but immediately after that it disconnects without making a single sound with this message :

    &#xA;

    2023-04-07 17:58:01 INFO     discord.player ffmpeg process 18258 has not terminated. Waiting to terminate... 2023-04-07 17:58:01 INFO     discord.player ffmpeg process 18258 should have terminated with a return code of -9. 2023-04-07 17:58:01 INFO     discord.voice_client The voice handshake is being terminated for Channel ID 1093533451778523241 (Guild ID 1093533451778523237) 2023-04-07 17:58:01 INFO     discord.voice_client Disconnecting from voice normally, close code 1000. Audio file loaded:  Audio could not be played:

    &#xA;

    Code :

    &#xA;

    import discord&#xA;import asyncio&#xA;import datetime&#xA;&#xA;TOKEN = &#x27;TOKEN HERE&#x27; &#xA;CHANNEL_ID = CHANNEL ID HERE&#xA;&#xA;client = discord.Client(intents=discord.Intents.all())&#xA;&#xA;async def play_sound(voice_client):&#xA;    try:&#xA;        source = discord.FFmpegPCMAudio(&#x27;audio.mp3&#x27;)&#xA;        print(f"Audio file loaded: {source}")&#xA;        voice_client.play(source)&#xA;        while voice_client.is_playing():&#xA;            await asyncio.sleep(1)&#xA;    except Exception as e:&#xA;        print(f"Audio could not be played: {e}")&#xA;&#xA;@client.event&#xA;async def on_ready():&#xA;    print(&#x27;Bot is ready&#x27;)&#xA;    now = datetime.datetime.now()&#xA;    target_time = datetime.time(hour=20, minute=00)&#xA;    if now.time() >= target_time:&#xA;        print(f"Current time: {now.time()}. Bot did not join channel.")&#xA;        return&#xA;    else:&#xA;        print(f"Current time: {now.time()}. Bot has joined at {target_time}.")&#xA;        await asyncio.sleep((datetime.datetime.combine(datetime.date.today(), target_time) - now).total_seconds())&#xA;        channel = client.get_channel(CHANNEL_ID)&#xA;        if channel is not None:&#xA;            try:&#xA;                voice_client = await channel.connect()&#xA;                print(f&#x27;{client.user} joined voice chat.&#x27;)&#xA;                await asyncio.sleep(1)&#xA;                await play_sound(voice_client)&#xA;                await voice_client.disconnect()&#xA;                print(f&#x27;{client.user} left voice chat.&#x27;)&#xA;            except Exception as e:&#xA;&#xA;                print(f"Error during joining channel : {e}")&#xA;        else:&#xA;            print(f"Did not find a channel of ID {CHANNEL_ID}.")&#xA;&#xA;client.run(TOKEN)&#xA;

    &#xA;

    Any ideas ?

    &#xA;

    ffmpeg has been installed properly.

    &#xA;