Recherche avancée

Médias (2)

Mot : - Tags -/media

Autres articles (83)

  • 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 ;

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

Sur d’autres sites (9053)

  • Wrong video duration when trying to make screen capture with libav\ffmpeg

    16 juin 2023, par Ларионов Фёдор

    I am performing screen capture using libav/c++ with the gdbigrab InputFormat and saving the transcoded video with h.264 to an .mp4 container. Despite doing all the necessary conversions from pts/dts frames and packets, the final video has an issue with its duration. When playing the video, it stops a few seconds before the end and rewinds back to the end.

    


    To diagnose the problem, I used FFprobe to examine the recorded video stream and found the following issues :

    


    ffprobe my_video.mp4 -show_streams

    


    Provides the following information :

    


    time_base=1/12800
start_pts=28096
start_time=2.195000
duration_ts=38945
duration=3.042578


    


    Although I tracked the frame and burst timestamps while recording, starting at zero and ending at the expected pts for the number of frames recorded, I tried to set the start and end time of the stream manually. I observed this problem with different time_base and different video durations, do some minor and major fixes that does not affected this issue. Interestingly, the start time always has the same offset, and the expected/specified video duration in the code is close to the sum of the duration of the video stream and its start time. What am I missing ?

    


    


    UPDATE :

    


    


    There is the source of problem :

    


    [mov,mp4,m4a,3gp,3g2,mj2 @ 000002a69f15b380] Processing st: 0, edit list 0 - media time: -1, duration: 27059
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002a69f15b380] Processing st: 0, edit list 1 - media time: 0, duration: 38912 


    


    which i get by that command ffmpeg -hide_banner -y -v 9 -loglevel 99 -i sc_test.mp4

    


    The question is where this edits happend.

    


  • How can I save the h264 encoded video as a sequence of AVPacket-s to the file using libav c++ ?

    8 juillet 2023, par danvik13

    I'm trying to save video, which is generated and encoded on fly using libav (ffmpeg) functional. When I receive next non-empty AVPacket with encoded frame, I call writer.saveNextPacket() method.
Of cause, before saving, I properly init both codec and filewriter and close them in the very ending.
Here is some code :

    


    #include "utils/FileWriter.h"

#define DEBUG 1

void tp::utils::FileWriter::open(const char* path, tp::encoders::IEncoder* encoder) {
    int hr;

    debI("guessing");
    format = av_guess_format(nullptr, path, nullptr);
    if (!format){
        debI("av_guess_format");
    }

    debI("allocating output");
    hr = avformat_alloc_output_context2(&formatContext, format, nullptr, nullptr);
    if (hr < 0){
        debI("avformat_alloc_output_context2", hr);
    }

    debI("allocating stream");
    stream = avformat_new_stream(formatContext, nullptr);
    if (!stream){
        debI("avformat_new_stream");
    }
    debI("setting parameters");
    AVCodecParameters* parameters = avcodec_parameters_alloc();
    hr = avcodec_parameters_from_context(parameters, encoder->getCodecContext());
    if (hr < 0){
        debI("avcodec_parameters_from_context", hr);
    }

    stream->codecpar = parameters;

    debI("opening");
    hr = avio_open(&formatContext->pb, path, AVIO_FLAG_WRITE);
    if (hr < 0){
        debI("avio_open", hr);
    }

    debI("writing headers");
    hr = avformat_write_header(formatContext, nullptr);
    if (hr < 0){
        debI("avformat_write_header", hr);
    }
    debI("writer is set");
}

#define DEBUG 0

void tp::utils::FileWriter::saveNextPacket(AVPacket* packet) {
    int hr;

    hr = av_interleaved_write_frame(formatContext, packet);
    if (hr < 0){
        logF("av_write_frame", hr);
    }
}

void tp::utils::FileWriter::close() {
    int hr;

    hr = av_write_trailer(formatContext);
    if (hr < 0){
        logF("av_write_trailer", hr);
    }

    hr = avio_close(formatContext->pb);
    if (hr < 0){
        logF("avio_close", hr);
    }

    avformat_free_context(formatContext);
}



    


    Here is the setup part of the encoder :

    


        codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!codec){
        logF("avcodec_find_encoder", hr);
    }
    codecContext = avcodec_alloc_context3(codec);
    if (!codecContext){
        logF("avcodec_alloc_context3");
    }
    codecContext->width = parameters.width;
    codecContext->height = parameters.height;
    codecContext->bit_rate = parameters.bitRate;
    codecContext->time_base = (AVRational){1, parameters.fps};
    codecContext->gop_size = 0;
    codecContext->max_b_frames = 0;
    codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
    if (parameters.preset == EncoderParameters::Preset::Fast){
        av_opt_set(codecContext->priv_data, "preset", "ultrafast", 0);
    }else if (parameters.preset == EncoderParameters::Preset::Slow){
        av_opt_set(codecContext->priv_data, "preset", "slow", 0);
    }

    hr = avcodec_open2(codecContext, codec, nullptr);
    if (hr < 0){
        logF("avcodec_open2", hr);
    }


    


    The problem : I open "output.mp4" file and assume that the class properly saves the header of the file. However, the file weights 262 bytes (there is no useful data such as frames) and it is corrupted for running video on any video players
ps : I've enabled libav logging, which seems to be ok, despite some messages :

    


      

    1. [file @ 0000017a74c6c540] Setting default whitelist 'file,crypto,data'
I have some concers about the appropriateness of the whitelist as no crypto is expected
    2. 


    3. [AVIOContext @ 0000017a6a249100] Statistics : 266 bytes written, 2 seeks, 3 writeouts
The actual size of the file is 262. Does it mean that there are some info leaking during saving and even the header is already broken ?
    4. 


    


    I've tried to adjust various codec settings. Even turning off any speed presets. Actually, the encoder was tested in the pair with various libav decoders and image rendering and I'm pretty sure about encoder part.
Moreover, I've written the FileWriter code three times as there are some dissimilar guides. Only the current code does not throw any warnings or errors.
Give me a hint, which part of code may be wrong or provide me with some samples of using latest ffmpeg and answer my questions, please.

    


  • Recursively encode video files in many directories

    15 juillet 2023, par menteith

    I'd like to encode video files in many directories in one go. In each directory when there is at least one *.mp4 file ffmpeg application should be run with correct arguments. Say a video file is named 01_file.mp4. I want the output file to be in the same directory as the source is located with name suffix processed at the end of filename but before extension. So the source 01_file.mp4would be saved as01_file_processed.mp4`.
I'm quite close to the correct solution. Here's my one-liner :

    


    find -mindepth 2 -type f ! -path '*processed.mp4' -name '*.mp4' -exec bash -c 'ffmpeg -loglevel warning -i "$1" -vf fps=23.976025 "${1%/*}/${1##*/}_processed"' _ {} \;

    


    I'm getting the error from ffmpeg since the output file is not correct. Instead of correct path ending with 01_file_processed.mp4 the file is 01_file.mp4_processed. I believe the error is in the following part ${1%/*}/output/${1##*/}". How do I fix this ?