Recherche avancée

Médias (2)

Mot : - Tags -/documentation

Autres articles (72)

  • Mise à jour de la version 0.1 vers 0.2

    24 juin 2013, par

    Explications des différents changements notables lors du passage de la version 0.1 de MediaSPIP à la version 0.3. Quelles sont les nouveautés
    Au niveau des dépendances logicielles Utilisation des dernières versions de FFMpeg (>= v1.2.1) ; Installation des dépendances pour Smush ; Installation de MediaInfo et FFprobe pour la récupération des métadonnées ; On n’utilise plus ffmpeg2theora ; On n’installe plus flvtool2 au profit de flvtool++ ; On n’installe plus ffmpeg-php qui n’est plus maintenu au (...)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Submit bugs and patches

    13 avril 2011

    Unfortunately a software is never perfect.
    If you think you have found a bug, report it using our ticket system. Please to help us to fix it by providing the following information : the browser you are using, including the exact version as precise an explanation as possible of the problem if possible, the steps taken resulting in the problem a link to the site / page in question
    If you think you have solved the bug, fill in a ticket and attach to it a corrective patch.
    You may also (...)

Sur d’autres sites (12448)

  • DTS value repeating, not synced with PTS (ffmpeg)

    24 novembre 2017, par Damian

    Just a quick question in regards to video encoding/muxing a video file with ffmpeg. Basically, I have my muxer functioning and I’m trying to have my packets output the correct PTS/DTS.

    This is a portion of my code that encodes my AVFrame, muxing it to an output file :

    int ret;
    int got_packet = 0;

    AVPacket pkt = { 0 };
    av_init_packet(&pkt);

    pkt.data = NULL;
    pkt.size = 0;

    /* encode the image */
    ret = avcodec_encode_video2(cc, &pkt, frame, &got_packet);
    if (ret < 0)
    {
       fprintf(stderr, "rasterbench: error encoding video frame: %s\n", av_err2str(ret));
       exit(EXIT_FAILURE);
    }

    if (got_packet)
    {
       av_packet_rescale_ts(&pkt, cc->time_base, st->time_base);

       fprintf(stderr, "\npkt.pts     = %ld\n", pkt.pts);
       fprintf(stderr,   "pkt.dts     = %ld\n", pkt.dts);
       fprintf(stderr, "rasterbench: writing frame\n");

       ret = av_interleaved_write_frame(fmt_ctx, &pkt);
       av_packet_unref(&pkt);
    }
    else
    {
       ret = 0;
    }

    ...

    I’m then getting an output of the following :

    pkt.pts     = 0
    pkt.dts     = 0
    rasterbench: writing frame

    pkt.pts     = 1502
    pkt.dts     = 0
    rasterbench: writing frame

    pkt.pts     = 3003
    pkt.dts     = 1502
    rasterbench: writing frame

    pkt.pts     = 4505
    pkt.dts     = 3003
    rasterbench: writing frame

    ...

    My goal is to have my PST and DST both with the pattern : 1502, 3003, 4505, 6006, 7508, ...

    But it seems that the first DTS value is repeating once, and thus being off-sync with it’s corresponding PTS value. It’s also worth mentioning that the codec context was configured to have no b-frames, so only i- and p- frames are present here.

    Does anyone with more experience have some insight on this ?

  • Remuxing mp4 on the fly with FFmpeg API

    25 octobre 2015, par Vadym

    My goal is to stream out mpegts. As input, I take an mp4 file stream. That is, video producer writes mp4 file into a stream that I try to work with. The video may be anywhere from one minute to ten minutes. Because producer writes bytes into stream, the originally written mp4 header is not complete (first 32 bytes prior to ftyp are 0x00 because it doesn’t know yet various offsets... which are written post-recording, I think) :

    This is how the header of typical mp4 looks like :

    00 00 00 18   66 74 79 70   69 73 6f 6d   00 00 00 00   ....ftypisom....
    69 73 6f 6d   33 67 70 34   00 01 bb 8c   6d 64 61 74   isom3gp4..»Œmdat

    This is how the header of "in progress" mp4 looks like :

    00 00 00 00   66 74 79 70   69 73 6f 6d   00 00 00 00   ....ftypisom....
    69 73 6f 6d   33 67 70 34   00 00 00 18   3f 3f 3f 3f   isom3gp4....????
    6d 64 61 74                                             mdat

    It is my guess but I assume that once the producer completes recording, it updates the header by writing all the necessary offsets.

    I have run into two issues while trying to make this work :

    1. I created a custom AVIO with read function that does not support seeking. In my driver program, I decided to stream in a properly formatted mp4 file. I am able to detect its input format. When I try to open it, I see that my custom read function gets executed within avformat_open_input until the entire file is read in.

    My code sample :

    av_register_all();

    AVFormatContext* pCtx = avformat_alloc_context();
    pCtx->pb = avio_alloc_context(
       pBuffer,         // internal buffer
       iBufSize,        // internal buffer size
       0,               // bWriteable (1=true,0=false)
       stream,          // user data ; will be passed to our callback functions
       read_stream,     // read callback function
       NULL,            // write callback function (not used in this example)
       NULL             // seek callback function
    );
    pCtx->pb->seekable = 0;
    pCtx->pb->write_flag = 0;
    pCtx->iformat = av_find_input_format( "mp4" );
    pCtx->flags |= AVFMT_FLAG_CUSTOM_IO;

    avformat_open_input( &pCtx, "", pCtx->iformat, NULL );

    Obviously, this does not work as I need (I expectations were wrong). Once I substitute the file of finite size by a stream of varies length, I cannot have avformat_open_input wait around for the stream to finish before attempting to do further processing.

    As such, I need to find a way to open input without attempt to read it and only read when I execute av_read_frame. Is this at all possible to do by using custom AVIO. That is, prepare/open input -> read initial input data into input buffer -> read frame/packet from input buffer -> write packet to output -> repeat read input data until the end of stream.

    I did scavenge google and only saw two alternatives : providing custom URLProtocol and using AVFMT_NOFILE.

    Custom URLProtocol
    This sounds like a little backwards way for what I’m trying to accomplish. I understand that it is best used when there is a file source available. Whereas I am trying to read from a byte stream. Also, another reason I think it doesn’t fit my needs is that custom URLProtocol needs to be compiled into ffmpeg lib, correct ? Or is there a way to manually register it during runtime ?

    AVFMT NOFILE
    This seems like something that should actually work best for me. The flag itself says that there is no underlying source file and assumes that I will handle all the reading and provisioning of input data. The trouble is that I haven’t seen any online code snippets so far but my assumption is as follows :

    I am really hoping to get some suggestions of food for brain from anyone because I am a newbie to ffmpeg and digital media and my second issue expects that I can stream output while ingesting input.

    1. As I mentioned above, I have a handle on the mp4 file bytestream as it would be written to the hard disk. The format is mp4 (h.264 and aac). I need to remux it to mpegts prior to streaming it out. This shouldn’t be difficult because mp4 and mpegts are simply containers. From what I learned so far, mp4 file looks the following :

      [header info containing format versions]
      mdat
      [stream data, in my case h.264 and aac streams]
      [some trailer separator]
      [trailer data]

    If that is correct, I should be able to get the handle on h.264 and aac interleaved data by simply starting to read the stream after "mdat" identifier, correct ?

    If that is true and I decide to go with AVFMT_NOFILE approach of managing input data, I can just ingest stream data (into AVFormatContext buffer) -> av_read_frame -> process it -> populate AVFormatContext with more data -> av_read_frame -> and so on until the end of stream.

    I know, this is a mouthful and a dump of my thoughts but I would appreciate any discussion, pointers, thoughts !

  • Kodi : playback several video files from the internet as single movie with single timeline

    30 mai 2018, par HarryFox

    I’m writing an add-on for Kodi in Python, for a site with movie collection, which can be able to playback online video from the site. But problem is that many of them splitted apart on pieces of different length. And its not mpeg dash nor m3u playlists, its just individual pieces of single movie or an episode.

    My target is able to play those splitted videos as single movie with single timeline and playback will no require download all pieces of a movie. It’s important because many of Movies\episodes provides with subtitle file, that why single timeline is important. Also general idea for plugin which I’m writing is comfort to use, so online playback is very important too.

    I did some research but it almost no result. On official Kodi forum advise to create Input Stream add-on like Input Stream Adaptive, but it was written on c++ and it’s unattainable for me (for now at least). There is no tools for python to create such kind of add-ons.

    Another idea is to create middle server which on fly will somehow (with ffmpeg) combine those pieces, but it seems that the process will too resource-intensive especially for TV-boxes.
    In this case also raise many question about which way is better, and i have no enough experience and knowledge to solve the problems by myself even with google.

    So i need an advice how can i solve the problem, just to know right direction.
    Thank you for your time.
    Sorry for my English.