Recherche avancée

Médias (0)

Mot : - Tags -/flash

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (55)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

  • Configurer la prise en compte des langues

    15 novembre 2010, par

    Accéder à la configuration et ajouter des langues prises en compte
    Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
    De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
    Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)

  • XMP PHP

    13 mai 2011, par

    Dixit Wikipedia, XMP signifie :
    Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
    Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
    XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)

Sur d’autres sites (5890)

  • How to merge two videos using FFMpeg PHP

    7 août 2015, par Vikas

    currently i am working on a project where i need to merge the two videos using ffmpeg and php. I need to make two video play same time and on stop should stop at same time and if one video stop’s than other should also pause. I have searched a lot but didn’t find any thing, hope anyone can help me.

  • Random segmentation fault with avcodec_encode_video2()

    10 août 2015, par Seba Arriagada

    this is my first question so i hope i did it correctly. If not, please let me know to fix it.

    I’m trying to convert a short (10 secs) mp4 video file into a gif using ffmpeg libraries (I’m pretty new using ffmpeg). The program works pretty well converting to gif, but some times it randomly crash.

    This is the version of the ffmpeg libraries I’m using :

    libavutil      54. 27.100
    libavcodec     56. 41.100
    libavformat    56. 36.100
    libavdevice    56.  4.100
    libavfilter     5. 16.101
    libavresample   2.  1.  0
    libswscale      3.  1.101
    libswresample   1.  2.100
    libpostproc    53.  3.100

    I’m using a 1920x1080p video, so in order to generate the gif I’m doing a pixel format convertion, from AV_PIX_FMT_YUV420P to AV_PIX_FMT_RGB8 with a resizing from the initial resolution to 432x240p.

    Here is the code :

    int VideoManager::loadVideo(QString filename, bool showInfo)
    {
       if(avformat_open_input(&iFmtCtx, filename.toStdString().c_str(), 0, 0) < 0)
       {
           qDebug() << "Could not open input file " << filename;
           closeInput();
           return -1;
       }
       if (avformat_find_stream_info(iFmtCtx, 0) < 0)
       {
           qDebug() << "Failed to retrieve input stream information";
           closeInput();
           return -2;
       }

       videoStreamIndex = -1;
       for(unsigned int i = 0; i < iFmtCtx->nb_streams; ++i)
           if(iFmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
           {
               videoStreamIndex = i;
               break;
           }

       if(videoStreamIndex == -1)
       {
           qDebug() << "Didn't find any video stream!";
           closeInput();
           return -3;
       }
       iCodecCtx = iFmtCtx->streams[videoStreamIndex]->codec;

       iCodec = avcodec_find_decoder(iCodecCtx->codec_id);
       if(iCodec == NULL) // Codec not found
       {
           qDebug() << "Codec not found!";
           closeInput();
           return -4;
       }
       if(avcodec_open2(iCodecCtx, iCodec, NULL) < 0)
       {
           qDebug() << "Could not open codec!";
           closeInput();
           return -1;
       }

       if(showInfo)
           av_dump_format(iFmtCtx, 0, filename.toStdString().c_str(), 0);

       return 0;
    }

    void VideoManager::generateGif(QString filename)
    {
       int ret, frameCount = 0;
       AVPacket packet;
       packet.data = NULL;
       packet.size = 0;
       AVFrame *frame = NULL;
       unsigned int stream_index;
       int got_frame;

       gifHeight = iFmtCtx->streams[videoStreamIndex]->codec->height;
       gifWidth  = iFmtCtx->streams[videoStreamIndex]->codec->width;

       if(gifHeight > MAX_GIF_HEIGHT || gifWidth > MAX_GIF_WIDTH)
       {
           if(gifHeight > gifWidth)
           {
               gifWidth  = (float)gifWidth * ( (float)MAX_GIF_HEIGHT / (float)gifHeight );
               gifHeight = MAX_GIF_HEIGHT;
           }
           else
           {
               gifHeight = (float)gifHeight * ( (float)MAX_GIF_WIDTH / (float)gifWidth );
               gifWidth  = MAX_GIF_WIDTH;
           }
       }


       if(openOutputFile(filename.toStdString().c_str()) < 0)
       {
           qDebug() << "Error openning output file: " << filename;
           return;
       }

       while (1) {
           int ret = av_read_frame(iFmtCtx, &packet);
           if (ret < 0)
           {
               if(ret != AVERROR_EOF)
                   qDebug() << "Error reading frame: " << ret;
               break;
           }
           stream_index = packet.stream_index;

           if(stream_index == videoStreamIndex)
           {
               frame = av_frame_alloc();
               if (!frame) {
                   qDebug() << "Error allocating frame";
                   break;
               }
               av_packet_rescale_ts(&packet,
                                    iFmtCtx->streams[stream_index]->time_base,
                                    iFmtCtx->streams[stream_index]->codec->time_base);

               ret = avcodec_decode_video2(iFmtCtx->streams[stream_index]->codec, frame,
                       &got_frame, &packet);
               if (ret < 0) {
                   qDebug() << "Decoding failed";
                   break;
               }

               if(got_frame)
               {
                   qDebug() << ++frameCount;
                   nframes++;
                   frame->pts = av_frame_get_best_effort_timestamp(frame);

                   ////////////////////////////////////////////////////////////////////////////////
                   /// Pixel format convertion and resize
                   ////////////////////////////////////////////////////////////////////////////////
                   uint8_t *out_buffer = NULL;
                   SwsContext *img_convert_ctx = NULL;
                   AVFrame *pFrameRGB = av_frame_alloc();

                   if(pFrameRGB == NULL)
                   {
                       qDebug() << "Error allocating frameRGB";
                       break;
                   }

                   AVPixelFormat pixFmt;
                   switch (iFmtCtx->streams[stream_index]->codec->pix_fmt)
                   {
                   case AV_PIX_FMT_YUVJ420P : pixFmt = AV_PIX_FMT_YUV420P; break;
                   case AV_PIX_FMT_YUVJ422P : pixFmt = AV_PIX_FMT_YUV422P; break;
                   case AV_PIX_FMT_YUVJ444P : pixFmt = AV_PIX_FMT_YUV444P; break;
                   case AV_PIX_FMT_YUVJ440P : pixFmt = AV_PIX_FMT_YUV440P; break;
                   default:
                       pixFmt = iFmtCtx->streams[stream_index]->codec->pix_fmt;
                   }

                   out_buffer = (uint8_t*)av_malloc( avpicture_get_size( AV_PIX_FMT_RGB8,
                                                     gifWidth,
                                                     gifHeight ));
                   if(!out_buffer)
                   {
                       qDebug() << "Error alocatting out_buffer!";
                   }
                   avpicture_fill((AVPicture *)pFrameRGB, out_buffer, AV_PIX_FMT_RGB8,
                                  gifWidth,
                                  gifHeight);
                   img_convert_ctx = sws_getContext( iFmtCtx->streams[stream_index]->codec->width,
                                                     iFmtCtx->streams[stream_index]->codec->height,
                                                     pixFmt,
                                                     gifWidth,
                                                     gifHeight,
                                                     AV_PIX_FMT_RGB8,
                                                     SWS_ERROR_DIFFUSION, NULL, NULL, NULL );

                   if(!img_convert_ctx)
                   {
                       qDebug() << "error getting sws context";
                   }

                   sws_scale( img_convert_ctx, (const uint8_t* const*)frame->data,
                              frame->linesize, 0,
                              iFmtCtx->streams[stream_index]->codec->height,
                              pFrameRGB->data,
                              pFrameRGB->linesize );

                   pFrameRGB->format = AV_PIX_FMT_RGB8;
                   pFrameRGB->pts = frame->pts;
                   pFrameRGB->best_effort_timestamp = frame->best_effort_timestamp;
                   pFrameRGB->width = gifWidth;
                   pFrameRGB->height = gifHeight;
                   pFrameRGB->pkt_dts = frame->pkt_dts;
                   pFrameRGB->pkt_pts = frame->pkt_pts;
                   pFrameRGB->pkt_duration = frame->pkt_duration;
                   pFrameRGB->pkt_pos = frame->pkt_pos;
                   pFrameRGB->pkt_size = frame->pkt_size;
                   pFrameRGB->interlaced_frame = frame->interlaced_frame;
                   ////////////////////////////////////////////////////////////////////////////////
                   ret = encodeAndWriteFrame(pFrameRGB, stream_index, NULL);
                   //av_frame_free(&frame);
                   //av_free(out_buffer);
                   //sws_freeContext(img_convert_ctx);
                   if (ret < 0)
                   {
                       qDebug() << "Error encoding and writting frame";
                       //av_free_packet(&packet);
                       closeOutput();
                   }
               }
               else {
                   //av_frame_free(&frame);
               }
           }
           av_free_packet(&packet);
       }

       ret = flushEncoder(videoStreamIndex);
       if (ret < 0)
       {
           qDebug() << "Flushing encoder failed";
       }

       av_write_trailer(oFmtCtx);

       //av_free_packet(&packet);
       //av_frame_free(&frame);
       closeOutput();
    }


    void VideoManager::closeOutput()
    {
       if (oFmtCtx && oFmtCtx->nb_streams > 0 && oFmtCtx->streams[0] && oFmtCtx->streams[0]->codec)
           avcodec_close(oFmtCtx->streams[0]->codec);
       if (oFmtCtx && oFmt && !(oFmt->flags & AVFMT_NOFILE))
           avio_closep(&oFmtCtx->pb);
       avformat_free_context(oFmtCtx);
    }

    int VideoManager::openOutputFile(const char *filename)
    {
       AVStream *out_stream;
       AVStream *in_stream;
       AVCodecContext *dec_ctx, *enc_ctx;
       AVCodec *encoder;
       int ret;

       oFmtCtx = NULL;
       avformat_alloc_output_context2(&oFmtCtx, NULL, NULL, filename);
       if (!oFmtCtx) {
           qDebug() << "Could not create output context";
           return AVERROR_UNKNOWN;
       }

       oFmt = oFmtCtx->oformat;

       out_stream = avformat_new_stream(oFmtCtx, NULL);
       if (!out_stream) {
           qDebug() << "Failed allocating output stream";
           return AVERROR_UNKNOWN;
       }

       in_stream = iFmtCtx->streams[videoStreamIndex];
       dec_ctx = in_stream->codec;
       enc_ctx = out_stream->codec;

       encoder = avcodec_find_encoder(AV_CODEC_ID_GIF);
       if (!encoder) {
           qDebug() << "FATAL!: Necessary encoder not found";
           return AVERROR_INVALIDDATA;
       }

       enc_ctx->height = gifHeight;    
       enc_ctx->width = gifWidth;      
       enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
       enc_ctx->pix_fmt = AV_PIX_FMT_RGB8;
       enc_ctx->time_base = dec_ctx->time_base;
       ret = avcodec_open2(enc_ctx, encoder, NULL);
       if (ret < 0) {
           qDebug() << "Cannot open video encoder for gif";
           return ret;
       }

       if (oFmt->flags & AVFMT_GLOBALHEADER)
           enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;

       if (!(oFmt->flags & AVFMT_NOFILE)) {
           ret = avio_open(&oFmtCtx->pb, filename, AVIO_FLAG_WRITE);
           if (ret < 0) {
               qDebug() << "Could not open output file " << filename;
               return ret;
           }
       }

       ret = avformat_write_header(oFmtCtx, NULL);
       if (ret < 0) {
           qDebug() << "Error occurred when opening output file";
           return ret;
       }

       return 0;
    }


    int VideoManager::encodeAndWriteFrame(AVFrame *frame, unsigned int stream_index, int *got_frame) {
       int ret;
       int got_frame_local;
       AVPacket enc_pkt;

       if (!got_frame)
           got_frame = &got_frame_local;

       enc_pkt.data = NULL;
       enc_pkt.size = 0;
       av_init_packet(&enc_pkt);
       ret = avcodec_encode_video2(oFmtCtx->streams[stream_index]->codec, &enc_pkt,
               frame, got_frame);
       //av_frame_free(&frame);
       if (ret < 0)
           return ret;
       if (!(*got_frame))
           return 0;

       enc_pkt.stream_index = stream_index;
       av_packet_rescale_ts(&enc_pkt,
                            oFmtCtx->streams[stream_index]->codec->time_base,
                            oFmtCtx->streams[stream_index]->time_base);

       ret = av_interleaved_write_frame(oFmtCtx, &enc_pkt);
       return ret;
    }


    int VideoManager::flushEncoder(unsigned int stream_index)
    {
       int ret;
       int got_frame;

       if (!(oFmtCtx->streams[stream_index]->codec->codec->capabilities &
                   CODEC_CAP_DELAY))
           return 0;

       while (1) {
           ret = encodeAndWriteFrame(NULL, stream_index, &got_frame);
           if (ret < 0)
               break;
           if (!got_frame)
               return 0;
       }
       return ret;
    }

    I know there are a lot of memory leaks. I deleted/commented most of the free functions intentionality because i thought that was the problem.

    I’m using Qtcreator, so when i debug the programs this is the output :

    Level Function                            Line
    0     av_image_copy                       303
    1     frame_copy_video                    650    
    2     av_frame_copy                       687    
    3     av_frame_ref                        384    
    4     gif_encode_frame                    307    
    5     avcodec_encode_video2               2191    
    6     VideoManager::encodeAndWriteFrame   813    
    7     VideoManager::generateGif           375    
    8     qMain                               31    
    9     WinMain*16                          112    
    10    main

    I’ve checked if there is a specific frame the program crash at, but it’s a random frame too.

    Any idea of what i’m doing wrong ? Any help would be very appreciated.

    EDIT :

    After a few days of pain, suffering and frustation I decided to write the whole code from scratch. Both times i started from this example and modified it in order to works as I described before. And it works perfectly now :D ! The only error i could find in the old code (posted before) is when i try to access to the video stream in the output file I used videoStreamIndex, but that index is from the video stream in the input file. Some times it could be the same index and some times not. But it doesn’t explain why it crashed randomly. If that was the reason of the crash, it should crash every time i ran the code with the same video. So probably, there are more errors in that code.
    Notice that i’ve not tested if fixing that error in the code above actually solve the crashing problems.

  • What is “interoperable TTML” ?

    19 septembre 2012, par silvia

    I’ve just tried to come to terms with the latest state of TTML, the Timed Text Markup Language.

    TTML has been specified by the W3C Timed Text Working Group and released as a RECommendation v1.0 in November 2010. Since then, several organisations have tried to adopt it as their caption file format. This includes the SMPTE, the EBU (European Broadcasting Union), and Microsoft.

    Both, Microsoft and the EBU actually looked at TTML in detail and decided that in order to make it usable for their use cases, a restriction of its functionalities is needed.

    EBU-TT

    The EBU released EBU-TT, which restricts the set of valid attributes and feature. “The EBU-TT format is intended to constrain the features provided by TTML, especially to make EBU-TT more suitable for the use with broadcast video and web video applications.” (see EBU-TT).

    In addition, EBU-specific namespaces were introduce to extend TTML with EBU-specific data types, e.g. ebuttdt:frameRateMultiplierType or ebuttdt:smpteTimingType. Similarly, a bunch of metadata elements were introduced, e.g. ebuttm:documentMetadata, ebuttm:documentEbuttVersion, or ebuttm:documentIdentifier.

    The use of namespaces as an extensibility mechanism will ascertain that EBU-TT files continue to be valid TTML files. However, any vanilla TTML parser will not know what to do with these custom extensions and will drop them on the floor.

    Simple Delivery Profile

    With the intention to make TTML ready for “internet delivery of Captions originated in the United States”, Microsoft proposed a “Simple Delivery Profile for Closed Captions (US)” (see Simple Profile). The Simple Profile is also a restriction of TTML.

    Unfortunately, the Microsoft profile is not the same as the EBU-TT profile : for example, it contains the “set” element, which is not conformant in EBU-TT. Similarly, the supported style features are different, e.g. Simple Profile supports “display-region”, while EBU-TT does not. On the other hand, EBU-TT supports monospace, sans-serif and serif fonts, while the Simple profile does not.

    Thus files created for the Simple Delivery Profile will not work on players that expect EBU-TT and the reverse.

    Fortunately, the Simple Delivery Profile does not introduce any new namespaces and new features, so at least it is an explicit subpart of TTML and not both a restriction and extension like EBU-TT.

    SMPTE-TT

    SMPTE also created a version of the TTML standard called SMPTE-TT. SMPTE did not decide on a subset of TTML for their purposes – it was simply adopted as a complete set. “This Standard provides a framework for timed text to be supported for content delivered via broadband means,…” (see SMPTE-TT).

    However, SMPTE extended TTML in SMPTE-TT with an ability to store a binary blob with captions in another format. This allows using SMPTE-TT as a transport format for any caption format and is deemed to help with “backwards compatibility”.

    Now, instead of specifying a profile, SMPTE decided to define how to convert CEA-608 captions to SMPTE-TT. Even if it’s not called a “profile”, that’s actually what it is. It even has its own namespace : “m608 :”.

    Conclusion

    With all these different versions of TTML, I ask myself what a video player that claims support for TTML will do to get something working. The only chance it has is to implement all the extensions defined in all the different profiles. I pity the player that has to deal with a SMPTE-TT file that has a binary blob in it and is expected to be able to decode this.

    Now, what is a caption author supposed to do when creating TTML ? They obviously cannot expect all players to be able to play back all TTML versions. Should they create different files depending on what platform they are targeting, i.e. a EBU-TT version, a SMPTE-TT version, a vanilla TTML version, and a Simple Delivery Profile version ? Should they by throwing all the features of all the versions into one TTML file and hope that the players will pick out the right things that they require and drop the rest on the floor ?

    Maybe the best way to progress would be to make a list of the “safe” features : those features that every TTML profile supports. That may be the best way to get an “interoperable TTML” file. Here’s me hoping that this minimal set of features doesn’t just end up being the usual (starttime, endtime, text) triple.

    UPDATE :

    I just found out that UltraViolet have their own profile of SMPTE-TT called CFF-TT (see UltraViolet FAQ and spec). They are making some SMPTE-TT fields optional, but introduce a new @forcedDisplayMode attribute under their own namespace “cff :”.