Recherche avancée

Médias (29)

Mot : - Tags -/Musique

Autres articles (104)

  • 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 (...)

  • Monitoring de fermes de MediaSPIP (et de SPIP tant qu’à faire)

    31 mai 2013, par

    Lorsque l’on gère plusieurs (voir plusieurs dizaines) de MediaSPIP sur la même installation, il peut être très pratique d’obtenir d’un coup d’oeil certaines informations.
    Cet article a pour but de documenter les scripts de monitoring Munin développés avec l’aide d’Infini.
    Ces scripts sont installés automatiquement par le script d’installation automatique si une installation de munin est détectée.
    Description des scripts
    Trois scripts Munin ont été développés :
    1. mediaspip_medias
    Un script de (...)

  • Les formats acceptés

    28 janvier 2010, par

    Les commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
    ffmpeg -codecs ffmpeg -formats
    Les format videos acceptés en entrée
    Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
    Les formats vidéos de sortie possibles
    Dans un premier temps on (...)

Sur d’autres sites (8397)

  • How to save ffmpeg segmets to disk immediately with sub-second intervals ?

    20 octobre 2023, par amfast

    I'm trying to record video on a raspberry and have it save as much as possible (sub-second resolution) in case of a power cutoff.

    


    I use -f segment to save the encoded stream in 100ms segments with the hope that all but the interrupted (by power cutoff) segment will be saved in memory. Unfortunately, when cutting off power, all the destination files (output_0001.mp4, output_0002.mp4, ...) are created, but empty.

    


    To save the files to disk immediately, I added the -strftime 1 option that allows formatting the output filename as time. It seems weird that this is the (only ?) way to trigger immediate saving of files, but it works - untill I try to have segments smaller than 1 second. The problem seems to be that the format string %d, that previously added a sequence number in my output filenames, now represents "day" (i.e. date) and the smallest resolution time format string is %S for second. I saw %f suggested somewhere for smaller resolutions, but it only prints "%f".

    


    The result is that the segmentation part of ffmpeg does create 100ms segments and save them to disk immediately, but the strftime feature gives the output files names that only change every second, so all the interim files are overwritten.

    


    Example of the failing command below. Without the -strftime option this creates nice segments, but does not save them to disk immediately.

    


    libcamera-vid --flush \
    --framerate ${FRAMERATE} \
    --width ${WIDTH} \
    --height ${HEIGHT} \
    -n \
    -t ${TIMEOUT} \
    --codec yuv420 \
    -o - | 
ffmpeg \
    -fflags nobuffer \
    -strict experimental \
    -loglevel debug \
    -flags low_delay \
    -f rawvideo \
    -pix_fmt yuv420p \
    -s:v ${WIDTH}x${HEIGHT} \
    -r ${FRAMERATE} \
    -i - \
    -c:v h264_v4l2m2m \
    -f segment \
    -segment_time 0.1 \
    -segment_format mp4 \
    -reset_timestamps 1 \
    -strftime 1 \
    -b:v ${ENCODING_BITRATE} \
    -g 1 \
    "output_%04d.mp4"


    


    Question :
    
Is there another way besides -strftime to trigger immediate saving ? Or is there a mechanism to feed finer resolution format strings to the output filename ?

    


  • OpenCV and GoPro - empty frames in VideoCapture stream

    19 mai 2014, par Novatar

    I have a GoPro Hero 3+ (Black) which is connected to a video capture card (AverMedia Game Broadcaster HD). I simply want to get the video stream in OpenCV. With a Logitech Webcam there are no problems. The used code is below.

    VideoCapture cap;
    cap.open(0);

    waitKey(300);

    //cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
    //cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

    if (cap.isOpened()){
       cout << "Cam identified" << endl;
    }

    namedWindow("dst", 1);

    while (1){

    Mat frame;

    if (!cap.read(frame)) {
       std::cout << "Unable to read frame from video stream" << std::endl;
       continue;
    }

    imshow("dst", frame);

    [...]

    }

    With the GoPro the following happens : OpenCV is able to open the VideoCapture ("Cam identified") but can’t read any frames (just a gray screen and the output : "Unable to read frame from video stream"). I also checked this with frame.empty() ;.

    I know that the video capture card works correct because Unity opens a WebCamTexture with the GoPro stream without any issues. I read about codec problems in OpenCv and so I already tried to compile OpenCV with FFMPEG support. Now the recorded MP4-Videos of the GoPro can be displayed but the stream still doesn’t work.

    I use OpenCV 2.48, Windows 7 and Visual Studio 2013.


    EDIT : Here is the code of libVLC solution :

    struct ctx
    {
    uint8_t* pixeldata;
    std::mutex imagemutex;
    };

    static void display(void *data, void *id);
    static void unlock(void *data, void *id, void *const *p_pixels);
    static void *lock(void *data, void **p_pixels);

    struct ctx ctx;

    libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    int main(int argc, char* argv[])
    {
       ctx.pixeldata = new uint8_t[1280 * 720 * 3];

       char const *vlc_argv[] =
       {
           "-vvv",
           "--no-audio", /* skip any audio track */
           "--no-xlib", /* tell VLC to not use Xlib */
       };

       int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
       inst = libvlc_new(vlc_argc, vlc_argv);

       const char *options[] =
       {
           ":dshow-vdev=AVerMedia HD Capture",
           ":dshow-adev=none",
           //":dshow-size=1280x720",
           ":dshow-fps=24",
           ":dshow-chroma=YUY2",
           ":dshow-video-input=1",
           ":dshow-video-output=1",
           ":dshow-aspect-ratio=16\:9",
           ":live-caching=80",
           NULL
       };

       m = libvlc_media_new_location(inst, "dshow://");
       for (const char **opt = options; *opt; opt++)
           libvlc_media_add_option(m, *opt);

       mp = libvlc_media_player_new_from_media(m);
       libvlc_media_release(m);
       libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx);
       libvlc_video_set_format(mp, "RV24", 1280, 720, 1280 * 3);
       libvlc_media_player_play(mp);

       namedWindow("all", 1);

       Mat frame(720, 1280, CV_8UC3);

       while (1){

           ctx.imagemutex.lock();
           memcpy(gesamt.data, ctx.pixeldata, 1280 * 720 * sizeof(uint8_t) * 3);
           ctx.imagemutex.unlock();

           imshow("all", gesamt);

           if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
           {
               cout << "esc key is pressed by user" << endl;
               break;
           }

       }

       libvlc_media_player_stop(mp);
       libvlc_media_player_release(mp);
       libvlc_release(inst);
       delete[] ctx.pixeldata;

       return 0;
    }

    void display(void *data, void *id){
       (void)data;
       assert(id == NULL);
    }

    void unlock(void *data, void *id, void *const *p_pixels){
       struct ctx *ctx = (struct ctx*)data;
       ctx->imagemutex.unlock();
       assert(id == NULL);
    }

    void *lock(void *data, void **p_pixels){
       struct ctx *ctx = (struct ctx*)data;
       ctx->imagemutex.lock();
       *p_pixels = ctx->pixeldata;
       return NULL;
    }
  • FFmpeg av_seek_frame() successful, but decoding always starts from the beginning

    3 avril, par Summit

    I'm working on a video player using FFmpeg in C++, where I need to seek to a specific PTS (timestamp) and start decoding from there. However, even after a successful av_seek_frame(), decoding always starts from frame 0 instead of the target frame.

    


    void decodeLoop() {
      while (!stopThread) {

          std::unique_lock lock(mtx);
          cv.wait(lock, [this] { return decoding || stopThread; });

          if (stopThread) break;

          int64_t reqTimestamp = requestedTimestamp.load();

          // **Skip redundant seeks**
          if (reqTimestamp == lastRequestedTimestamp.load()) {
              continue;  // Avoid unnecessary seeks
          }

          int64_t requestedTS = requestedTimestamp.load();
          AVRational stream_tb = fmt_ctx->streams[video_stream_index]->time_base;
          int64_t target_pts = reqTimestamp;
          target_pts = FFMAX(target_pts, 0); // Ensure it's not negative

          int seek_flags = AVSEEK_FLAG_BACKWARD;

          if (av_seek_frame(fmt_ctx, video_stream_index, target_pts, seek_flags) >= 0) {
              avcodec_flush_buffers(codec_ctx);  // Clear old frames from the decoder
              avformat_flush(fmt_ctx);          // **Flush demuxer**
              qDebug() << "Seek successful to PTS:" << target_pts;
       //      avfilter_graph_free(&filter_graph);  // Reset filter graph
          }
          else {
              qDebug() << "Seeking failed!";
              decoding = false;
              continue;
          }

          lock.unlock();

          // Keep decoding frames until we reach (or slightly exceed) requestedTimestamp
          bool frameDecoded = false;
          while (av_read_frame(fmt_ctx, pkt) >= 0) {
              if (pkt->stream_index == video_stream_index) {
                  if (avcodec_send_packet(codec_ctx, pkt) == 0) {
                      while (avcodec_receive_frame(codec_ctx, frame) == 0) {
                          int64_t frame_pts = frame->pts;

                          // Skip frames before reaching target PTS
                          if (frame_pts < requestedTimestamp.load()) {

                              qDebug() << "SKIPPING FRAMES " << frame_pts;
                              av_frame_unref(frame);  // Free unused frame memory
                              continue;  // Discard early frames
                          }

                          qDebug() << "DECODING THE SEEKED FRAMES " << frame_pts;

                          if (frame_pts >= requestedTimestamp.load()) {
                             
                                  // Accept frame only if it's close enough to the target PTS
                                  current_pts.store(frame_pts);
                                  lastRequestedTimestamp.store(requestedTimestamp.load());
                                  convertHWFrameToImage(frame);
                                  emit frameDecodedSignal(outputImage);
                                  frameDecoded = true;
                                  break;  // Stop decoding once we reach the desired frame
                             
                          }
                      }
                  }
              }
              av_packet_unref(pkt);

              if (frameDecoded) break;
          }

          decoding = false;
      }
  }