Recherche avancée

Médias (1)

Mot : - Tags -/Rennes

Autres articles (16)

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

  • Ajouter notes et légendes aux images

    7 février 2011, par

    Pour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
    Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
    Modification lors de l’ajout d’un média
    Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)

  • Gestion générale des documents

    13 mai 2011, par

    MédiaSPIP ne modifie jamais le document original mis en ligne.
    Pour chaque document mis en ligne il effectue deux opérations successives : la création d’une version supplémentaire qui peut être facilement consultée en ligne tout en laissant l’original téléchargeable dans le cas où le document original ne peut être lu dans un navigateur Internet ; la récupération des métadonnées du document original pour illustrer textuellement le fichier ;
    Les tableaux ci-dessous expliquent ce que peut faire MédiaSPIP (...)

Sur d’autres sites (4942)

  • MOOV atom is not being written to the output.

    18 juillet 2014, par AnilJ

    I am facing a problem where a MOOV atom is not written to the end of the file, and the file is not playable by the vlc player. Also, FFmpeg command gives me the following error.

    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x2334ba0] moov atom not found
    queueout/1000_wrecord.mp4: Invalid data found when processing input

    In my design, I am using an object of DataChunkQueue class to initialize the IContainer object, where it writes into this queue when it calls IContainer.WritePacket(packet) method. Finally when the recording is complete, I am flushing out this queue into a file. However, when I try to play the file, above error is thrown. When I test with the FLV file type however, I am able to playout the file correctly.

    I am not sure what is the issue with the MP4 file and why it does not write the MOOV item to the end. Can anyone offer me an suggestions as to how this can be resolved ?

    I am pasting below some of the code snippets for reference.

    public class DataChunkQueue implements ByteChannel {

       private ConcurrentLinkedQueue<datachunk> mChunkQueue = null;
       private static String BASE_PATH = null;
       private static String mOutputFileName = null;
       private FileChannel mOutputFileChannel = null;

       // constructor
       public DataChunkQueue() {
           mChunkQueue = new ConcurrentLinkedQueue<datachunk>();
       }

       @Override
       public void close() throws IOException {
           return;
       }

       @Override
       public boolean isOpen() {
           return true;
       }

       @Override
       public int write(ByteBuffer buffer) throws IOException {
           DataChunk vChunk = new DataChunk(buffer);
           mChunkQueue.add(vChunk);    
           return 0;
       }

       public int read(ByteBuffer buffer) throws IOException {

           int result = 0;

           buffer = mChunkQueue.poll().GetBuffer();
           if (buffer != null ) {
               result = 0;
           } else {
               result = 1;
           }

           return result;
       }
    }

    private boolean InitStreamEncoder() {

       DataChunkQueue mOutQueue = null;
       // Change this to change the frame rate you record at
       mFrameRate = IRational.make(Constants.FRAME_RATE, 1);

       // try opening a container format
       mOutFormat = IContainerFormat.make();
       mOutFormat.setOutputFormat(mRecordFormat, null, null);

       // Initialize the output container.
       mOutputContainer = IContainer.make();
       int retval = mOutputContainer.open(mOutQueue, IContainer.Type.WRITE, mOutFormat);
       if (retval &lt; 0)
           throw new RuntimeException("could not open data output stream buffer");

       // Guess the Encoding CODEC based on the type of input file.
       ICodec videoCodec = ICodec.guessEncodingCodec(null, null, ("out." + mRecordFormat), null, ICodec.Type.CODEC_TYPE_VIDEO);
       if (videoCodec == null)
           throw new RuntimeException("could not guess a codec");

       // Initialize the encoding parameters.
       mOutStream = mOutputContainer.addNewStream(videoCodec);
       mOutStreamCoder = mOutStream.getStreamCoder();

       mOutStreamCoder.setNumPicturesInGroupOfPictures(Constants.GOP);
       mOutStreamCoder.setCodec(videoCodec);

       //mOutStreamCoder.setBitRate(Constants.BITRATE);
       //mOutStreamCoder.setBitRateTolerance(Constants.TOLERANCE);
       mOutStreamCoder.setPixelType(IPixelFormat.Type.YUV420P);
       mOutStreamCoder.setWidth(Constants.MAIN_SCREEN_WIDTH);
       mOutStreamCoder.setHeight(Constants.MAIN_SCREEN_HEIGHT);
       //mOutStreamCoder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, true);
       //mOutStreamCoder.setGlobalQuality(0);

       mOutStreamCoder.setFrameRate(mFrameRate);
       mOutStreamCoder.setTimeBase(IRational.make(mFrameRate.getDenominator(), mFrameRate.getNumerator()));

       retval = mOutStreamCoder.open(null, null);
       if (retval &lt; 0) {
           System.out.println("could not open input decoder");
           return false;      
       }

       retval = mOutputContainer.writeHeader();
       if (retval &lt; 0) {
           System.out.println("could not write file header");
           return false;
       }

       return true;
    }
    </datachunk></datachunk>

    This function is called at the very end to write the trailer.

    public void Cleanup() {
       if (mOutputContainer != null) {
           mOutputContainer.flushPackets();
           mOutputContainer.writeTrailer();
           mOutputContainer.close();
       }

       if (mOutStreamCoder != null) {
           mOutStreamCoder.close();
           mOutStreamCoder = null;
       }
    }
  • FFmpeg - capture a rtsp stream and re-stream it to another rtsp-server

    15 mars 2021, par moster67

    I want to capture a Rtsp-stream from a Live-CAM which I then want to re-stream to another Rtsp-server.&#xA;Basically, my computer will work as a relay-server using FFMpeg.

    &#xA;

    I have tried this temporary command but I cannot get it working i.e.

    &#xA;

    ffmpeg.exe -i rtsp://InputIPAddress:554/mystream -preset medium -vcodec libx264 -tune zerolatency -f rtsp -rtsp_transport tcp rtsp://localhost:8554/mysecondstream&#xA;

    &#xA;

    I have then tried, for testing purposes, using FFplay to watch the stream from localhost as follows :

    &#xA;

    ffplay rtsp://localhost:8554/mysecondstream&#xA;

    &#xA;

    but no luck.

    &#xA;

    Anyone who can help me out ? Thanks.

    &#xA;

  • Encoding .png images with h264 to a file on disk

    21 février 2021, par xyfix

    Can somebody help me to find out why I end up with a file on disk that is only 24 kb and not readable by vlc or so, while I send valid YUV images to the codec. I have added the .h and .cpp file. Up till "avcodec_receive_packet" everything seems to be OK. The function call "avcodec_send_frame" returns 0, so that must be OK but "avcodec_receive_packet" returns -11. If I flush the encoder (currently commented) then "avcodec_receive_packet" returns 0 and I can see encoded data if I store it on disk. Also the input image to the encoder is also correct (currently commented) and checked. I'm aiming for an intra-frame encoding, so I should get the encoded frame data back, but I don't get anything back even if I send 24 images to it.

    &#xA;

    .h file

    &#xA;

    #ifndef MOVIECODEC_H&#xA;#define MOVIECODEC_H&#xA;&#xA;#include &#xA;&#xA;extern "C"&#xA;{&#xA;    #include "Codec/include/libavcodec/avcodec.h"&#xA;    #include "Codec/include/libavdevice/avdevice.h"&#xA;    #include "Codec/include/libavformat/avformat.h"&#xA;    #include "Codec/include/libavutil/avutil.h"&#xA;    #include "Codec/include/libavutil/imgutils.h"&#xA;    #include "Codec/include/libswscale/swscale.h"&#xA;}&#xA;&#xA;&#xA;class MovieCodec&#xA;{&#xA;public:&#xA;&#xA;    MovieCodec(const char *filename);&#xA;&#xA;    ~MovieCodec();&#xA;&#xA;    void encodeImage( const cv::Mat&amp; image );&#xA;&#xA;    void close();&#xA;    &#xA;private :&#xA;&#xA;    void add_stream();&#xA;&#xA;    void openVideoCodec();&#xA;&#xA;    void write_video_frame(const cv::Mat&amp; image);&#xA;&#xA;    void createFrame( const cv::Mat&amp; image );&#xA;&#xA;private:&#xA;&#xA;    static int s_frameCount;&#xA;&#xA;    int m_timeVideo = 0;&#xA;&#xA;    std::string m_filename;&#xA;&#xA;    FILE* m_file;&#xA;&#xA;    AVCodec* m_encoder = NULL;&#xA;&#xA;    AVOutputFormat* m_outputFormat = NULL;&#xA;&#xA;    AVFormatContext* m_formatCtx = NULL;&#xA;&#xA;    AVCodecContext* m_codecCtx = NULL;&#xA;&#xA;    AVStream* m_streamOut = NULL;&#xA;&#xA;    AVFrame* m_frame = NULL;&#xA;&#xA;    AVPacket* m_packet = NULL;&#xA;&#xA;};&#xA;

    &#xA;

    .cpp file

    &#xA;

    #ifndef MOVIECODEC_CPP&#xA;#define MOVIECODEC_CPP&#xA;&#xA;#include "moviecodec.h"&#xA;&#xA;&#xA;#define STREAM_DURATION   5.0&#xA;#define STREAM_FRAME_RATE 24&#xA;#define STREAM_NB_FRAMES  ((int)(STREAM_DURATION * STREAM_FRAME_RATE))&#xA;#define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */&#xA;&#xA;&#xA;static int sws_flags = SWS_BICUBIC;&#xA;int MovieCodec::s_frameCount = 0;&#xA;&#xA;MovieCodec::MovieCodec( const char* filename ) :&#xA;    m_filename( filename ),&#xA;    m_encoder( avcodec_find_encoder( AV_CODEC_ID_H264 ))&#xA;{&#xA;    av_log_set_level(AV_LOG_VERBOSE);&#xA;&#xA;    int ret(0);&#xA;&#xA;    m_file = fopen( m_filename.c_str(), "wb");&#xA;&#xA;    // allocate the output media context&#xA;    ret = avformat_alloc_output_context2( &amp;m_formatCtx, m_outputFormat, NULL, m_filename.c_str());&#xA;&#xA;    if (!m_formatCtx)&#xA;        return;&#xA;&#xA;    m_outputFormat = m_formatCtx->oformat;&#xA;&#xA;    // Add the video stream using H264 codec&#xA;    add_stream();&#xA;&#xA;    // Open video codec and allocate the necessary encode buffers&#xA;    if (m_streamOut)&#xA;        openVideoCodec();&#xA;&#xA;    av_dump_format( m_formatCtx, 0, m_filename.c_str(), 1);&#xA;&#xA;    // Open the output media file, if needed&#xA;    if (!( m_outputFormat->flags &amp; AVFMT_NOFILE))&#xA;    {&#xA;        ret = avio_open( &amp;m_formatCtx->pb, m_filename.c_str(), AVIO_FLAG_WRITE);&#xA;&#xA;        if (ret &lt; 0)&#xA;        {&#xA;            char error[255];&#xA;            ret = av_strerror( ret, error, 255);&#xA;            fprintf(stderr, "Could not open &#x27;%s&#x27;: %s\n", m_filename.c_str(), error);&#xA;            return ;&#xA;        }&#xA;    }&#xA;    else&#xA;    {&#xA;        return;&#xA;    }&#xA;&#xA;    m_formatCtx->flush_packets = 1;&#xA;&#xA;    ret = avformat_write_header( m_formatCtx, NULL );&#xA;&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        char error[255];&#xA;        av_strerror(ret, error, 255);&#xA;        fprintf(stderr, "Error occurred when opening output file: %s\n", error);&#xA;        return;&#xA;    }&#xA;&#xA;&#xA;    if ( m_frame )&#xA;           m_frame->pts = 0;&#xA;}&#xA;&#xA;&#xA;&#xA;MovieCodec::~MovieCodec()&#xA;{&#xA;    close();&#xA;}&#xA;&#xA;&#xA;&#xA;void MovieCodec::encodeImage(const cv::Mat &amp;image)&#xA;{&#xA;    // Compute video time from last added video frame&#xA;    m_timeVideo = (double)m_frame->pts) * av_q2d(m_streamOut->time_base);&#xA;&#xA;    // Stop media if enough time&#xA;    if (!m_streamOut /*|| m_timeVideo >= STREAM_DURATION*/)&#xA;       return;&#xA;&#xA;    // Add a video frame&#xA;    write_video_frame( image );&#xA;&#xA;    // Increase frame pts according to time base&#xA;    m_frame->pts &#x2B;= av_rescale_q(1, m_codecCtx->time_base, m_streamOut->time_base);&#xA;}&#xA;&#xA;&#xA;void MovieCodec::close()&#xA;{&#xA;    int ret( 0 );&#xA;&#xA;    // Write media trailer&#xA;//    if( m_formatCtx )&#xA;//        ret = av_write_trailer( m_formatCtx );&#xA;&#xA;    /* flush the encoder */&#xA;    ret = avcodec_send_frame(m_codecCtx, NULL);&#xA;&#xA;    /* Close each codec. */&#xA;    if ( m_streamOut )&#xA;    {&#xA;        av_free( m_frame->data[0]);&#xA;        av_free( m_frame );&#xA;    }&#xA;&#xA;    if (!( m_outputFormat->flags &amp; AVFMT_NOFILE))&#xA;        /* Close the output file. */&#xA;        ret = avio_close( m_formatCtx->pb);&#xA;&#xA;&#xA;    /* free the stream */&#xA;    avformat_free_context( m_formatCtx );&#xA;&#xA;    fflush( m_file );&#xA;}&#xA;&#xA;&#xA;void MovieCodec::createFrame( const cv::Mat&amp; image )&#xA;{&#xA;    /**&#xA;     * \note allocate frame&#xA;     */&#xA;    m_frame = av_frame_alloc();&#xA;    m_frame->format = STREAM_PIX_FMT;&#xA;    m_frame->width = image.cols();&#xA;    m_frame->height = image.rows();&#xA;    m_frame->pict_type = AV_PICTURE_TYPE_I;&#xA;    int ret = av_image_alloc(m_frame->data, m_frame->linesize, m_frame->width,  m_frame->height, STREAM_PIX_FMT, 1);&#xA;&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        return;&#xA;    }&#xA;&#xA;    struct SwsContext* sws_ctx = sws_getContext((int)image.cols(), (int)image.rows(), AV_PIX_FMT_RGB24,&#xA;                                                (int)image.cols(), (int)image.rows(), STREAM_PIX_FMT, 0, NULL, NULL, NULL);&#xA;&#xA;    const uint8_t* rgbData[1] = { (uint8_t* )image.getData() };&#xA;    int rgbLineSize[1] = { 3 * image.cols() };&#xA;&#xA;    sws_scale(sws_ctx, rgbData, rgbLineSize, 0, image.rows(), m_frame->data, m_frame->linesize);&#xA;}&#xA;&#xA;&#xA;/* Add an output stream. */&#xA;void MovieCodec::add_stream()&#xA;{&#xA;    AVCodecID codecId = AV_CODEC_ID_H264;&#xA;&#xA;    if (!( m_encoder ))&#xA;    {&#xA;        fprintf(stderr, "Could not find encoder for &#x27;%s&#x27;\n",&#xA;            avcodec_get_name(codecId));&#xA;        return;&#xA;    }&#xA;&#xA;    // Get the stream for codec&#xA;    m_streamOut = avformat_new_stream(m_formatCtx, m_encoder);&#xA;&#xA;    if (!m_streamOut) {&#xA;        fprintf(stderr, "Could not allocate stream\n");&#xA;        return;&#xA;    }&#xA;&#xA;    m_streamOut->id = m_formatCtx->nb_streams - 1;&#xA;&#xA;    m_codecCtx = avcodec_alloc_context3( m_encoder);&#xA;&#xA;    m_streamOut->codecpar->codec_id = codecId;&#xA;    m_streamOut->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    m_streamOut->codecpar->bit_rate = 400000;&#xA;    m_streamOut->codecpar->width = 800;&#xA;    m_streamOut->codecpar->height = 640;&#xA;    m_streamOut->codecpar->format = STREAM_PIX_FMT;&#xA;    m_streamOut->codecpar->codec_tag = 0x31637661;&#xA;    m_streamOut->codecpar->video_delay = 0;&#xA;    m_streamOut->time_base = { 1, STREAM_FRAME_RATE };&#xA;&#xA;&#xA;    avcodec_parameters_to_context( m_codecCtx, m_streamOut->codecpar);&#xA;    &#xA;    m_codecCtx->gop_size = 0; /* emit one intra frame every twelve frames at most */&#xA;    m_codecCtx->max_b_frames = 0;&#xA;    m_codecCtx->time_base = { 1, STREAM_FRAME_RATE };&#xA;    m_codecCtx->framerate = { STREAM_FRAME_RATE, 1 };&#xA;    m_codecCtx->pix_fmt = STREAM_PIX_FMT;&#xA;&#xA;&#xA;&#xA;    if (m_streamOut->codecpar->codec_id == AV_CODEC_ID_H264)&#xA;    {&#xA;      av_opt_set( m_codecCtx, "preset", "ultrafast", 0 );&#xA;      av_opt_set( m_codecCtx, "vprofile", "baseline", 0 );&#xA;      av_opt_set( m_codecCtx, "tune", "zerolatency", 0 );&#xA;    }&#xA;&#xA;//    /* Some formats want stream headers to be separate. */&#xA;//    if (m_formatCtx->oformat->flags &amp; AVFMT_GLOBALHEADER)&#xA;//            m_codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;&#xA;&#xA;&#xA;}&#xA;&#xA;&#xA;void MovieCodec::openVideoCodec()&#xA;{&#xA;    int ret;&#xA;&#xA;    /* open the codec */&#xA;    ret = avcodec_open2(m_codecCtx, m_encoder, NULL);&#xA;&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        char error[255];&#xA;        av_strerror(ret, error, 255);&#xA;        fprintf(stderr, "Could not open video codec: %s\n", error);&#xA;    }&#xA;}&#xA;&#xA;&#xA;&#xA;void MovieCodec::write_video_frame( const cv::Mat&amp; image )&#xA;{&#xA;    int ret;&#xA;&#xA;    createFrame( image );&#xA;&#xA;&#xA;    if (m_formatCtx->oformat->flags &amp; 0x0020 )&#xA;    {&#xA;        /* Raw video case - directly store the picture in the packet */&#xA;        AVPacket pkt;&#xA;        av_init_packet(&amp;pkt);&#xA;&#xA;        pkt.flags |= AV_PKT_FLAG_KEY;&#xA;        pkt.stream_index = m_streamOut->index;&#xA;        pkt.data = m_frame->data[0];&#xA;        pkt.size = sizeof(AVPicture);&#xA;&#xA;//        ret = av_interleaved_write_frame(m_formatCtx, &amp;pkt);&#xA;        ret = av_write_frame( m_formatCtx, &amp;pkt );&#xA;    }&#xA;    else&#xA;    {&#xA;        AVPacket pkt;&#xA;        av_init_packet(&amp;pkt);&#xA;&#xA;        /* encode the image */&#xA;&#xA;//cv::Mat yuv420p( m_frame->height &#x2B; m_frame->height/2, m_frame->width, CV_8UC1, m_frame->data[0]);&#xA;//cv::Mat cvmIm;&#xA;//cv::cvtColor(yuv420p,cvmIm,CV_YUV420p2BGR);&#xA;//cv::imwrite("c:\\tmp\\YUVoriginal.png", cvmIm);&#xA;&#xA;        ret = avcodec_send_frame(m_codecCtx, m_frame);&#xA;&#xA;        if (ret &lt; 0)&#xA;        {&#xA;            char error[255];&#xA;            av_strerror(ret, error, 255);&#xA;            fprintf(stderr, "Error encoding video frame: %s\n", error);&#xA;            return;&#xA;        }&#xA;&#xA;        /* If size is zero, it means the image was buffered. */&#xA;//        ret = avcodec_receive_packet(m_codecCtx, &amp;pkt);&#xA;&#xA;        do&#xA;        {&#xA;            ret = avcodec_receive_packet(m_codecCtx, &amp;pkt);&#xA;&#xA;            if (ret == 0)&#xA;            {&#xA;                ret = av_write_frame( m_formatCtx, &amp;pkt );&#xA;                av_packet_unref(&amp;pkt);&#xA;&#xA;                break;&#xA;            }&#xA;//            else if ((ret &lt; 0) &amp;&amp; (ret != AVERROR(EAGAIN)))&#xA;//            {&#xA;//                return;&#xA;//            }&#xA;//            else if (ret == AVERROR(EAGAIN))&#xA;//            {&#xA;//                /* flush the encoder */&#xA;//                ret = avcodec_send_frame(m_codecCtx, NULL);&#xA;//&#xA;//                if (0 > ret)&#xA;//                    return;&#xA;//            }&#xA;        } while (ret == 0);&#xA;&#xA;        if( !ret &amp;&amp; pkt.size)&#xA;        {&#xA;            pkt.stream_index = m_streamOut->index;&#xA;&#xA;            /* Write the compressed frame to the media file. */&#xA;//            ret = av_interleaved_write_frame(m_formatCtx, &amp;pkt);&#xA;            ret = av_write_frame( m_formatCtx, &amp;pkt );&#xA;        }&#xA;        else&#xA;        {&#xA;            ret = 0;&#xA;        }&#xA;    }&#xA;&#xA;    if (ret != 0)&#xA;    {&#xA;        char error[255];&#xA;        av_strerror(ret, error, 255);&#xA;        fprintf(stderr, "Error while writing video frame: %s\n", error);&#xA;        return;&#xA;    }&#xA;&#xA;    s_frameCount&#x2B;&#x2B;;&#xA;}&#xA;

    &#xA;