Recherche avancée

Médias (1)

Mot : - Tags -/bug

Autres articles (53)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • Support audio et vidéo HTML5

    10 avril 2011

    MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
    Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
    Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
    Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)

Sur d’autres sites (8139)

  • How to configure proc_open "pipes" for ffmpeg stdin/stderr on Windows ?

    10 septembre 2018, par GDP

    Firstly, I’ve spent the week googling and trying variations of dozens and dozens of answers for Unix, but it’s been a complete bust, I need an answer for Windows, so this is not a duplicate question of the Unix equivalents.

    We’re trying to create a scheduled task that will process a queue of tasks in PHP, and maintain an array of up to 10 ffmpeg instances at a time. I’ve tried exec, shell_exec and proc_open , coupled with/without start /B without any "complete" luck.
    I’m also quite certain that it has to do with setting up the descriptorspec and pipes (which I’m completely unfamiliar with), and here’s why :

    Per https://trac.ffmpeg.org/wiki/PHP,

    The part that says ">/dev/null" will redirect the standard OUTPUT
    (stdout) of the ffmpeg instance to /dev/null (effectively ignoring the
    output) and "2>/dev/null" will redirect the standard ERROR (stderr) to
    /dev/null (effectively ignoring any error log messages). These two can
    be combined into a shorter representation : ">/dev/null 2>&1". If you
    like, you can ?read more about I/O Redirection.

    An important note should be mentioned here. The ffmpeg command-line
    tool uses stderr for output of error log messages and stdout is
    reserved for possible use of pipes (to redirect the output media
    stream generated from ffmpeg to some other command line tool). That
    being said, if you run your ffmpeg in the background, you’ll most
    probably want to redirect the stderr to a log file, to be able to
    check it later.

    One more thing to take care about is the standard INPUT (stdin).
    Command-line ffmpeg tool is designed as an interactive utility that
    accepts user’s input (usually from keyboard) and reports the error log
    on the user’s current screen/terminal. When we run ffmpeg in the
    background, we want to tell ffmpeg that no input should be accepted
    (nor waited for) from the stdin. We can tell this to ffmpeg, using I/O
    redirection again "

    echo "Starting ffmpeg...\n\n";
    echo shell_exec("ffmpeg -y -i input.avi output.avi null >/dev/null 2>/var/log/ffmpeg.log &");
    echo "Done.\n";

    This example actually uses shell_exec, though we want to use proc_open so that we can use a loop to check if the process has completed or not.

    Here’s a basic sample loop of what I’ve tried. The problem in executing this is that the actual ffmpeg processing completes, but the process is hung "waiting for something". When I use debugging, and step out of the loop and terminate the process after a few minutes, the ffmpeg output is written and the script carries on. (From the command line, ffmpeg takes less than a minute to complete)

    $descriptorspec = array(
       array('pipe', 'r'),
       array('pipe', 'w'),
       array('pipe', 'w'),
    );
    $pipes = null;
    $cwd = null;
    $env = null;
    $process = proc_open('start /B ffmpeg.exe -i input.mov output.mp4 -nostdin', $descriptorspec, $pipes, $cwd, $env);
    $status = proc_get_status($process);
    while($status['running']) {
       sleep (60);
       $status = proc_get_status($process);
    }
    proc_terminate($process);

    Also, as documented at ffmpeg Main-options :

    Enable interaction on standard input. On by default unless standard
    input is used as an input. To explicitly disable interaction you need
    to specify -nostdin.

    The -nostdin option seems to indicate that it addresses my problem, but it has no apparent affect. In all solutions for Unix that I’ve found, it appears to still require some form of this this unix added : null or 2>&1.

    So, with that somewhat exhaustive prologue, can someone explain how to properly configure the proc_open function to satisfy how ffmpeg.exe interacts with I/O ? If there is a better or more appropriate approach, I’m happy to do that, but the important thing is to be able to loop thru an array of processes to check if they’re complete, so that other faster processes can complete in the meantime.

    UPDATE
    After exhaustive R&D, it seems that the I/O is not the issue in making this happen (the -nostdin option seems to work as advertised). The premise of my design was to use proc_get_status() to determine when ffmpeg was finished. The flaw in that approach is that apparently that does NOT return the actual PID of the ffmpeg process...it returns the parent PID. So, when proc_get_status() returned that the video conversion was complete, it was in fact still running, not hung. This was further complicated by testing on larger video files. The larger the video, the longer the "residual" time was that it took to actually finish — the I/O wasn’t the issue - watching the Parent PID instead of the child PID was the problem. So, without getting into much lower level system internals with Windows, this doesn’t appear to be possible with PHP directly. I’ve decided to abandon this approach, but hopefully this discovery will save someone else some time and trouble.

  • ffmpeg stops capturing whole hour of HTTP stream after some time

    7 juillet 2020, par CompuChip

    First of all, sorry if I'm using the wrong terminology. I've been playing around with nginx and I'm still a bit confused about RTMP and HLS and other acronyms.

    


    I've managed to setup OBS to stream to an nginx server, which takes the RTMP stream and chops it into pieces for HLS. Here's the relevant part of the nginx configuration file.

    


    rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        ping 30s;
        deny play all;

        application live {
            live on;
            hls on;
            hls_nested on; # Create a new folder for each stream
            hls_path /mnt/hls/live;
            hls_fragment 3s;
            hls_fragment_naming timestamp;
            hls_playlist_length 60s;
        }
    }
}

http {
    server {
        listen 81 ssl;

        #creates the http-location for our full-resolution (desktop) HLS stream - "http://localhost:8080/live/test/index.m3u8"
        location /live {
            # Elided caching and CORS for brevity

            alias /mnt/hls/live;
            add_header Cache-Control no-cache;
            index index.m3u8;
        }
    }
}


    


    This works well, I can view the stream in VLC or on a website and it looks smooth. Now I wanted to add some logging : I'd like to write full hours (starting at xx:00:00 and ending at xx:59:59) to a file named log_yyyymmdd_hh.mp4, e.g. log_20200707_18.mp4 for the files of 7 July 2020, 18:00 - 19:00 hrs. So I've set up an hourly cron job with the following ffmpeg command :

    


    ffmpeg -i https://stream.example.com:81/live/<streamkey> -preset veryfast -maxrate 2000k \&#xA;    -bufsize 2000k -g 60 -t 3600 -y /var/video/log/$(date &#x2B;\%Y\%m\%d_\%H00).mp4 >/dev/null 2>&amp;1&#xA;</streamkey>

    &#xA;

    At first this seemed to work well, so I left it running happily for about 24 hours. When I checked, most of my hourly files were small ( 100MB) files of about 10 to 15 minutes long. It seems like any small delay in the stream will cause ffmpeg to stop writing to the file. I suspect such hiccups may for example be caused by an OBS plugin and I'll need to look into that, but I would prefer that ffmpeg will retry for some time before giving up. What arguments should I be passing to ffmpeg to make it not break when the stream is down for, say, up to a second every now and then ?.

    &#xA;

    When I view back the HLS files there don't seem to be any noticeable gaps, so eventually all the data arrives. I went for the crontab solution with ffmpeg because when recording from nginx I could not figure out how to start recording at the start of the whole hour.

    &#xA;

  • What am I doing wrong ? Tweepy with ffmpeg

    27 août 2020, par pigeonburger

    I'm trying to get this code to pull the media from any tweet that mentions my twitter handle, convert it using ffmpeg via the subprocess module, then send the converted media back to the person as a reply ? Is this all correct ?&#xA;

    I am also getting an error at tweet_media = clean_data[&#x27;entities&#x27;][&#x27;media&#x27;][&#x27;media_url&#x27;] and I don't understand what I'm doing wrong there (Exception has occurred : TypeError&#xA;list indices must be integers or slices, not str&#xA;line 32, in on_data&#xA;tweet_media = clean_data['entities']['media']['media_url'])

    &#xA;

    Also is there a better way to use ffmpeg with python that I am not aware of ?

    &#xA;

    Here is the code I wrote that I'm trying to use :

    &#xA;

    import tweepy&#xA;from tweepy import Stream&#xA;from tweepy.streaming import StreamListener&#xA;from datetime import datetime&#xA;import time&#xA;import subprocess&#xA;&#xA;stdout = subprocess.PIPE&#xA;def runcmd(cmd):&#xA;    x = subprocess.Popen(cmd, stdout=subprocess.PIPE)&#xA;    return x.communicate(stdout)&#xA;&#xA;print(" TWITTER BOT")&#xA;time.sleep(1.5)&#xA;print(" By PigeonBurger, updated 26 August 2020 \n")&#xA;&#xA;import json&#xA;import random&#xA;&#xA;class StdOutListener(StreamListener):&#xA;    def on_data(self, data):&#xA;        clean_data = json.loads(data)&#xA;        tweetId = clean_data[&#x27;id&#x27;]&#xA;        tweet_name = clean_data[&#x27;user&#x27;][&#x27;screen_name&#x27;]&#xA;        tweet_media = clean_data[&#x27;entities&#x27;][&#x27;media&#x27;][&#x27;media_url&#x27;]&#xA;        tweet_photo = runcmd(&#x27;ffmpeg -i tweet_media output.jpg&#x27;)&#xA;        print(clean_data)&#xA;        tweet = &#x27;Here ya go&#x27;&#xA;        now = datetime.now()&#xA;        dt_string = now.strftime("%d/%m/%Y %H:%M:%S")&#xA;        print(&#x27; Reply sent to @&#x27;&#x2B;tweet_name, &#x27;on&#x27;, dt_string, &#x27;\n&#x27; &#x27; Message:&#x27;, tweet, &#x27;\n&#x27;)&#xA;        respondToTweet(tweet_photo, tweet, tweetId)&#xA;&#xA;def setUpAuth():&#xA;    auth = tweepy.OAuthHandler("consumer_key", "consumer_secret")&#xA;    auth.set_access_token("access_token", "access_token_secret")&#xA;    api = tweepy.API(auth)&#xA;    return api, auth&#xA;&#xA;def followStream():&#xA;    api, auth = setUpAuth()&#xA;    listener = StdOutListener()&#xA;    stream = Stream(auth, listener)&#xA;    stream.filter(track=["@YOUR_TWITTER_HANDLE"], is_async=True)&#xA;&#xA;def respondToTweet(tweet_photo, tweet, tweetId):&#xA;    api, auth = setUpAuth()&#xA;    api.update_with_media(tweet_photo, tweet, in_reply_to_status_id=tweetId, auto_populate_reply_metadata=True, stall_warnings=True)&#xA;&#xA;if __name__ == "__main__":&#xA;    followStream()&#xA;

    &#xA;