Recherche avancée

Médias (2)

Mot : - Tags -/doc2img

Autres articles (96)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Multilang : améliorer l’interface pour les blocs multilingues

    18 février 2011, par

    Multilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
    Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela.

  • Use, discuss, criticize

    13 avril 2011, par

    Talk to people directly involved in MediaSPIP’s development, or to people around you who could use MediaSPIP to share, enhance or develop their creative projects.
    The bigger the community, the more MediaSPIP’s potential will be explored and the faster the software will evolve.
    A discussion list is available for all exchanges between users.

Sur d’autres sites (11525)

  • How do you run a ffmpeg command in Java, in MacOS, using a ProcessBuilder

    5 août 2020, par nottAbott

    I am writing a program in Java that uses ffmpeg to "snip" a video into several pieces and the stitch them back together again. I have everything working relatively smoothly in Windows, but I cannot get ffmpeg to work in Mac, or in Linux for that matter. I'm focusing on mac right now though. I thought that it might be a permissions problem, but when I run it with sudo I get an error that says (after typing in the password :

    


    sudo: ffmpeg: command not found


    


    when I run it without sudo I get :

    


    java.io.IOException: Cannot run program "ffmpeg": error=2, No such file or directory


    


    I think that it might be because the ffmpeg package, on the Mac machine, was downloaded with homebrew, and ffmpeg is stored in /usr/local/Cellar/ffmpeg instead of the default folder, wherever it may be. That may not be the problem though, because I deleted ffmpeg and re-downloaded it with homebrew. It may have been in its defaulter folder in my first tests as well. It would be great to figure this out. Most of my family uses Mac (not me) and I really want to share my work with them. That is why I chose to code this in Java. Oh, and I did try using the directory to the binary in the command. Here's the code :

    


        //snips out all the clips from the main video
    public void snip() throws IOException, InterruptedException {
        
        for(int i = 0; i < snippets.size(); i++) {
            //ffmpeg -i 20sec.mp4 -ss 0:0:1 -to 0:0:5 -c copy foobar.mp4
            String newFile = "foobar" + String.valueOf(i) + ".mp4";
            
            //THIS WORKS
            if(OS.isWindows()) {
                ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", videoName, "-ss",
                        snippets.get(i).getStartTime(), "-to", snippets.get(i).getEndTime(), newFile);
                            
                Process process = processBuilder.inheritIO().start();
                process.waitFor();
                System.out.println("Win Snip " + i + "\n");
            }
            
            else if (OS.isMac()) {
                //FFMPEG LOCATION: /usr/local/Cellar/ffmpeg
                //THE ERROR: sudo: ffmpeg: command not found
                //ERROR W/OUT SUDO: java.io.IOException: Cannot run program "ffmpeg": error=2, No such file or directory
                ProcessBuilder processBuilder = new ProcessBuilder("sudo", "-S", "ffmpeg", "-f", videoName, "-ss",
                        snippets.get(i).getStartTime(), "-to", snippets.get(i).getEndTime(), newFile);
                
                Process process = processBuilder.inheritIO().start();
                process.waitFor();
                System.out.println("Mac Snip " + i + "\n");
            }
            
            else if (OS.isUnix()) {
                System.out.println("Your operating system is not supported");
                //TODO
                //need to figure out if deb/red hat/whatever are different
            }
            
            else if (OS.isSolaris()) {
                System.out.println("Your operating system is not supported yet");
                //TODO probably won't do
            }
            
            else {
                 System.out.println("Your operating system is not supported");
            }
            //add to the list of files to be concat later
            filesToStitch.add(newFile);
            filesToDelete.add(newFile);
            
        }
        //System.out.println(stitchFiles);
    }


    


  • Seeking to every 30th frame in .mp4 file with ffmpeg

    6 mars 2020, par MTRNS

    I’m trying to seek to every 30th frame and read motion vectors from packets.

    // Move the video 1 frame
    av_read_frame(fmt_ctx, &pkt);
    if (pkt.stream_index == video_stream_idx)
       ret = decode_packet(&pkt);
    av_packet_unref(&pkt);

    // Read motion vectors until end of video
    while (av_read_frame(fmt_ctx, &pkt) >= 0) {
       if (pkt.stream_index == video_stream_idx)
           ret = decode_packet(&pkt);

       // Find packet frame
       int pcktPts = av_rescale_q(pkt.pts,
               fmt_ctx->streams[video_stream_idx]->time_base,
               fmt_ctx->streams[video_stream_idx]->codec->time_base);
       pcktPts = (pcktPts/video_dec_ctx->ticks_per_frame);

       // Find target position from packet (30 frames ahead)
       int target = (pcktPts+30) *
                    (fmt_ctx->streams[video_stream_idx]->time_base.den /
                     fmt_ctx->streams[video_stream_idx]->time_base.num) /
                    (fmt_ctx->streams[video_stream_idx]->codec->time_base.den /
                     fmt_ctx->streams[video_stream_idx]->codec->time_base.num )*
                    video_dec_ctx->ticks_per_frame;

       // Seek to 30 frames ahead
       avformat_seek_file(fmt_ctx, video_stream_idx, 0, target, target, AVSEEK_FLAG_ANY);

       av_packet_unref(&pkt);
       if (ret < 0)
           break;
    }

    Running through this, it runs well at first, but starts to hang at around the 6th or 7th frame analyzed. Here’s my output of what frame I’m decoding :

    1
    31
    61
    92
    123
    155
    187
    220
    237
    237
    237
    ...

    where it just stalls on frame 237. So a few things are wrong : the program is hanging, and I’m not increasing by 30 frames every time, but by 30 + some random number. I must be using some function wrong. This is specifically for .mp4 files.

    Essentially, I want to read motion vectors from every frame following an I-frame. My entire program is here :

    #include <libavutil></libavutil>motion_vector.h>
    #include <libavformat></libavformat>avformat.h>

    static AVFormatContext *fmt_ctx = NULL;
    static AVCodecContext *video_dec_ctx = NULL;
    static AVStream *video_stream = NULL;
    static const char *src_filename = NULL;

    static int video_stream_idx = -1;
    static AVFrame *frame = NULL;
    static int video_frame_count = 0;

    static int decode_packet(const AVPacket *pkt)
    {
       char szFileName[255] = {0};
       FILE *file = NULL;
       int ret = avcodec_send_packet(video_dec_ctx, pkt);
       if (ret &lt; 0) {
           fprintf(stderr, "Error while sending a packet to the decoder: %s\n", av_err2str(ret));
           return ret;
       }

       while (ret >= 0)  {
           ret = avcodec_receive_frame(video_dec_ctx, frame);
           if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
               break;
           } else if (ret &lt; 0) {
               fprintf(stderr, "Error while receiving a frame from the decoder: %s\n", av_err2str(ret));
               return ret;
           }

           if (ret >= 0) {
               int i;
               AVFrameSideData *sd;
               video_frame_count++;
               sprintf(szFileName, "./mv/frame%d.txt", video_frame_count);
               file = fopen(szFileName, "w");
               sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
               if (sd) {
                   const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
                   for (i = 0; i &lt; sd->size / sizeof(*mvs); i++) {
                       const AVMotionVector *mv = &amp;mvs[i];
                       fprintf(file, "%4d %4d %4d %4d\n",
                           abs(mv->motion_x),
                           abs(mv->motion_y),
                           abs(mv->src_x - mv->dst_x),
                           abs(mv->src_y - mv->dst_y));
                   }
               }
               fclose(file);
               av_frame_unref(frame);
           }
       }

       return 0;
    }

    static int open_codec_context(AVFormatContext *fmt_ctx, enum AVMediaType type)
    {
       int ret;
       AVStream *st;
       AVCodecContext *dec_ctx = NULL;
       AVCodec *dec = NULL;
       AVDictionary *opts = NULL;

       ret = av_find_best_stream(fmt_ctx, type, -1, -1, &amp;dec, 0);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not find %s stream in input file '%s'\n",
                   av_get_media_type_string(type), src_filename);
           return ret;
       } else {
           int stream_idx = ret;
           st = fmt_ctx->streams[stream_idx];

           dec_ctx = avcodec_alloc_context3(dec);
           if (!dec_ctx) {
               fprintf(stderr, "Failed to allocate codec\n");
               return AVERROR(EINVAL);
           }

           ret = avcodec_parameters_to_context(dec_ctx, st->codecpar);
           if (ret &lt; 0) {
               fprintf(stderr, "Failed to copy codec parameters to codec context\n");
               return ret;
           }

           // Initialize video decoder
           av_dict_set(&amp;opts, "flags2", "+export_mvs", 0);
           if ((ret = avcodec_open2(dec_ctx, dec, &amp;opts)) &lt; 0) {
               fprintf(stderr, "Failed to open %s codec\n",
                       av_get_media_type_string(type));
               return ret;
           }

           video_stream_idx = stream_idx;
           video_stream = fmt_ctx->streams[video_stream_idx];
           video_dec_ctx = dec_ctx;
       }

       return 0;
    }

    int main(int argc, char **argv)
    {
       int ret = 0;
       AVPacket pkt = { 0 };

       if (argc != 2) {
           fprintf(stderr, "Usage: %s <video>\n", argv[0]);
           exit(1);
       }
       src_filename = argv[1];

       if (avformat_open_input(&amp;fmt_ctx, src_filename, NULL, NULL) &lt; 0) {
           fprintf(stderr, "Could not open source file %s\n", src_filename);
           exit(1);
       }

       if (avformat_find_stream_info(fmt_ctx, NULL) &lt; 0) {
           fprintf(stderr, "Could not find stream information\n");
           exit(1);
       }

       open_codec_context(fmt_ctx, AVMEDIA_TYPE_VIDEO);
       av_dump_format(fmt_ctx, 0, src_filename, 0);

       if (!video_stream) {
           fprintf(stderr, "Could not find video stream in the input, aborting\n");
           ret = 1;
           goto end;
       }

       frame = av_frame_alloc();
       if (!frame) {
           fprintf(stderr, "Could not allocate frame\n");
           ret = AVERROR(ENOMEM);
           goto end;
       }

       // Move the video 1 frame
       av_read_frame(fmt_ctx, &amp;pkt);
       if (pkt.stream_index == video_stream_idx)
           ret = decode_packet(&amp;pkt);
       av_packet_unref(&amp;pkt);

       // Read motion vectors until end of video
       while (av_read_frame(fmt_ctx, &amp;pkt) >= 0) {
           if (pkt.stream_index == video_stream_idx)
               ret = decode_packet(&amp;pkt);

           int pcktPts = av_rescale_q(pkt.pts,
                   fmt_ctx->streams[video_stream_idx]->time_base,
                   fmt_ctx->streams[video_stream_idx]->codec->time_base);
           pcktPts = (pcktPts/video_dec_ctx->ticks_per_frame);

           int target = (pcktPts+30) *
                        (fmt_ctx->streams[video_stream_idx]->time_base.den /
                         fmt_ctx->streams[video_stream_idx]->time_base.num) /
                        (fmt_ctx->streams[video_stream_idx]->codec->time_base.den /
                         fmt_ctx->streams[video_stream_idx]->codec->time_base.num )*
                        video_dec_ctx->ticks_per_frame;

           avformat_seek_file(fmt_ctx, video_stream_idx, 0, target, target, AVSEEK_FLAG_ANY);

           av_packet_unref(&amp;pkt);
           if (ret &lt; 0)
               break;
       }

       // Flush cached frames
       decode_packet(NULL);
       fprintf(stderr, "Finished decoding.\n\n");

    end:
       avcodec_free_context(&amp;video_dec_ctx);
       avformat_close_input(&amp;fmt_ctx);
       av_frame_free(&amp;frame);
       return ret &lt; 0;
    }
    </video>
  • Record sound with ffmpeg on ubuntu 12.04 [closed]

    27 juin 2012, par vzybilly

    I have been working for a few days on trying to get ffmpeg to record sound, a short list of what I've tried :

    #Crappy screen grab
    #ffmpeg -f x11grab -s "1366x768" -r "24" -i :0.0 -f mp4 ./out
    #awesome screen grab, grabbing sound but non out.
    #ffmpeg -f x11grab -s "1366x768" -r "24" -i :0.0 -f alsa -ac 2 -i pulse -vcodec libx264 -s "1366x768" -acodec libmp3lame -ab 128k -threads 0 -f mp4 ~/Desktop/vid
    #audio test, no audio in file.
    #ffmpeg -f alsa -ac 2 -i pulse -acodec libmp3lame -ab 128k -threads 0 -f mp3 ./test.mp3
    #awesome screen grab.
    #ffmpeg -f x11grab -s "1366x768" -r "24" -i :0.0 -threads 0 -sameq -an -f mp4 ~/Desktop/vid[/CODE]I&#39;m running ubuntu 12.04 from beta(ish)

    it would be awesome if someone could help me get this to work all in one line or (the way i'm going) multiple instances of ffmpeg (screen grab, microphone, program)

    I have also tried the pavucontrol with doing the monitoring of when recording audio, but that does not help either.

    Thanks for all of your help, vzybilly 

    EDIT :
    This one crashed.

    $ ffmpeg -f alsa -ac 2 -i plughw:0,0 -f x11grab -r 100 -s 1366x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -preset ultrafast -threads 3 testVid.mkv
    ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
     built on Jun 12 2012 16:37:58 with gcc 4.6.3
    *** THIS PROGRAM IS DEPRECATED ***
    This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
    [alsa @ 0x8fce240] capture with some ALSA plugins, especially dsnoop, may hang.
    [alsa @ 0x8fce240] Estimating duration from bitrate, this may be inaccurate
    Input #0, alsa, from &#39;plughw:0,0&#39;:
     Duration: N/A, start: 433.999945, bitrate: N/A
       Stream #0.0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    [x11grab @ 0x8fde820] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 1366 height: 768
    [x11grab @ 0x8fde820] shared memory extension  found
    [x11grab @ 0x8fde820] Estimating duration from bitrate, this may be inaccurate
    Input #1, x11grab, from &#39;:0.0&#39;:
     Duration: N/A, start: 1340805516.368518, bitrate: N/A
       Stream #1.0: Video: rawvideo, bgra, 1366x768, -2147483 kb/s, 100 tbr, 1000k tbn, 100 tbc
    File &#39;testVid.mkv&#39; already exists. Overwrite ? [y/N] y
    Incompatible pixel format &#39;bgra&#39; for codec &#39;libx264&#39;, auto-selecting format &#39;yuv420p&#39;
    [buffer @ 0x8fde700] w:1366 h:768 pixfmt:bgra
    [avsink @ 0x8fcdf20] auto-inserting filter &#39;auto-inserted scaler 0&#39; between the filter &#39;src&#39; and the filter &#39;out&#39;
    [scale @ 0x8ff3ce0] w:1366 h:768 fmt:bgra -> w:1366 h:768 fmt:yuv420p flags:0x4
    [libx264 @ 0x8fdd920] lookaheadless mb-tree requires intra refresh or infinite keyint
    [libx264 @ 0x8fdd920] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x8fdd920] profile Constrained Baseline, level 4.2
    [libx264 @ 0x8fdd920] 264 - core 120 r2151 a3f4407 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=0
    Output #0, matroska, to &#39;archinstall4.mkv&#39;:
     Metadata:
       encoder         : Lavf53.21.0
       Stream #0.0: Video: libx264, yuv420p, 1366x768, q=-1--1, 1k tbn, 100 tbc
       Stream #0.1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    Stream mapping:
     Stream #1.0 -> #0.0
     Stream #0.0 -> #0.1
    Press ctrl-c to stop encoding
    [alsa @ 0x8fce240] ALSA buffer xrun.
    [matroska @ 0x8fcd980] Application provided invalid, non monotonically increasing dts to muxer in stream 1: 213 >= 213
    av_interleaved_write_frame(): Invalid argument

    Any thoughts ?

    EDIT & ANSWER :
    Got it all working with a script :

    #!/bin/bash
    #vzybilly
    #these are temp files
    aud="aud.mp3"
    vid="vid.mp4"
    #grab audio &amp; pid
    ffmpeg -f alsa -ac 2 -i plughw:0,0 $aud &amp;
    audPID=$!
    #grab screen &amp; pid
    ffmpeg -f x11grab -s "1366x768" -r "24" -i :0.0 -threads 0 -sameq -an -f mp4 $vid &amp;
    vidPID=$!
    #wait, till name given (that means stop)
    read -p "Stop by giving an Output video name?" out
    #stop audio and video with pids
    kill -n 2 $audPID
    kill -n 2 $vidPID
    echo "$out"
    #combine to the target output file
    ffmpeg -i $aud -i $vid -acodec copy -vcodec copy "$out"
    #purge the temp files
    rm $aud
    rm $vid