Recherche avancée

Médias (1)

Mot : - Tags -/publier

Autres articles (111)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

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

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

Sur d’autres sites (9951)

  • Can not add tmcd stream using libavcodec to replicate behavior of ffmpeg -timecode option

    2 août, par Sailor Jerry

    I'm trying to replicate option of command line ffmpeg -timecode in my C/C++ code. For some reasons the tcmd stream is not written to the output file. However the av_dump_format shows it in run time

    


    Here is my minimal test

    


    #include <iostream>&#xA;extern "C" {&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavutil></libavutil>avutil.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;#include <libavutil></libavutil>opt.h>&#xA;#include <libavutil></libavutil>imgutils.h>&#xA;#include <libavutil></libavutil>samplefmt.h>&#xA;}&#xA;bool checkProResAvailability() {&#xA;  const AVCodec* codec = avcodec_find_encoder_by_name("prores_ks");&#xA;  if (!codec) {&#xA;    std::cerr &lt;&lt; "ProRes codec not available. Please install FFmpeg with ProRes support." &lt;&lt; std::endl;&#xA;    return false;&#xA;  }&#xA;  return true;&#xA;}&#xA;&#xA;int main(){&#xA;  av_log_set_level(AV_LOG_INFO);&#xA;&#xA;  const char* outputFileName = "test_tmcd.mov";&#xA;  AVFormatContext* formatContext = nullptr;&#xA;  AVCodecContext* videoCodecContext = nullptr;&#xA;&#xA;  if (!checkProResAvailability()) {&#xA;    return -1;&#xA;  }&#xA;&#xA;  std::cout &lt;&lt; "Creating test file with tmcd stream: " &lt;&lt; outputFileName &lt;&lt; std::endl;&#xA;&#xA;  // Allocate the output format context&#xA;  if (avformat_alloc_output_context2(&amp;formatContext, nullptr, "mov", outputFileName) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to allocate output context!" &lt;&lt; std::endl;&#xA;    return -1;&#xA;  }&#xA;&#xA;  if (avio_open(&amp;formatContext->pb, outputFileName, AVIO_FLAG_WRITE) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to open output file!" &lt;&lt; std::endl;&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  // Find ProRes encoder&#xA;  const AVCodec* videoCodec = avcodec_find_encoder_by_name("prores_ks");&#xA;  if (!videoCodec) {&#xA;    std::cerr &lt;&lt; "Failed to find the ProRes encoder!" &lt;&lt; std::endl;&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  // Video stream setup&#xA;  AVStream* videoStream = avformat_new_stream(formatContext, nullptr);&#xA;  if (!videoStream) {&#xA;    std::cerr &lt;&lt; "Failed to create video stream!" &lt;&lt; std::endl;&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  videoCodecContext = avcodec_alloc_context3(videoCodec);&#xA;  if (!videoCodecContext) {&#xA;    std::cerr &lt;&lt; "Failed to allocate video codec context!" &lt;&lt; std::endl;&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  videoCodecContext->width = 1920;&#xA;  videoCodecContext->height = 1080;&#xA;  videoCodecContext->pix_fmt = AV_PIX_FMT_YUV422P10;&#xA;  videoCodecContext->time_base = (AVRational){1, 30}; // Set FPS: 30&#xA;  videoCodecContext->bit_rate = 2000000;&#xA;&#xA;  if (avcodec_open2(videoCodecContext, videoCodec, nullptr) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to open ProRes codec!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  if (avcodec_parameters_from_context(videoStream->codecpar, videoCodecContext) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to copy codec parameters to video stream!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  videoStream->time_base = videoCodecContext->time_base;&#xA;&#xA;  // Timecode stream setup&#xA;  AVStream* timecodeStream = avformat_new_stream(formatContext, nullptr);&#xA;  if (!timecodeStream) {&#xA;    std::cerr &lt;&lt; "Failed to create timecode stream!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  timecodeStream->codecpar->codec_type = AVMEDIA_TYPE_DATA;&#xA;  timecodeStream->codecpar->codec_id = AV_CODEC_ID_TIMED_ID3;&#xA;  timecodeStream->codecpar->codec_tag = MKTAG(&#x27;t&#x27;, &#x27;m&#x27;, &#x27;c&#x27;, &#x27;d&#x27;); // Timecode tag&#xA;  timecodeStream->time_base = (AVRational){1, 30}; // FPS: 30&#xA;&#xA;  if (av_dict_set(&amp;timecodeStream->metadata, "timecode", "00:00:30:00", 0) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to set timecode metadata!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  // Write container header&#xA;  if (avformat_write_header(formatContext, nullptr) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to write file header!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  // Encode a dummy video frame&#xA;  AVFrame* frame = av_frame_alloc();&#xA;  if (!frame) {&#xA;    std::cerr &lt;&lt; "Failed to allocate video frame!" &lt;&lt; std::endl;&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  frame->format = videoCodecContext->pix_fmt;&#xA;  frame->width = videoCodecContext->width;&#xA;  frame->height = videoCodecContext->height;&#xA;&#xA;  if (av_image_alloc(frame->data, frame->linesize, frame->width, frame->height, videoCodecContext->pix_fmt, 32) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to allocate frame buffer!" &lt;&lt; std::endl;&#xA;    av_frame_free(&amp;frame);&#xA;    avcodec_free_context(&amp;videoCodecContext);&#xA;    avio_close(formatContext->pb);&#xA;    avformat_free_context(formatContext);&#xA;    return -1;&#xA;  }&#xA;&#xA;  // Fill frame with black&#xA;  memset(frame->data[0], 0, frame->linesize[0] * frame->height); // Y plane&#xA;  memset(frame->data[1], 128, frame->linesize[1] * frame->height / 2); // U plane&#xA;  memset(frame->data[2], 128, frame->linesize[2] * frame->height / 2); // V plane&#xA;&#xA;  // Encode the frame&#xA;  AVPacket packet;&#xA;  av_init_packet(&amp;packet);&#xA;  packet.data = nullptr;&#xA;  packet.size = 0;&#xA;&#xA;  if (avcodec_send_frame(videoCodecContext, frame) == 0) {&#xA;    if (avcodec_receive_packet(videoCodecContext, &amp;packet) == 0) {&#xA;      packet.stream_index = videoStream->index;&#xA;      av_interleaved_write_frame(formatContext, &amp;packet);&#xA;      av_packet_unref(&amp;packet);&#xA;    }&#xA;  }&#xA;&#xA;  av_frame_free(&amp;frame);&#xA;&#xA;  // Write a dummy packet for the timecode stream&#xA;  AVPacket tmcdPacket;&#xA;  av_init_packet(&amp;tmcdPacket);&#xA;  tmcdPacket.stream_index = timecodeStream->index;&#xA;  tmcdPacket.flags |= AV_PKT_FLAG_KEY;&#xA;  tmcdPacket.data = nullptr; // Empty packet for timecode&#xA;  tmcdPacket.size = 0;&#xA;  tmcdPacket.pts = 0; // Set necessary PTS&#xA;  tmcdPacket.dts = 0;&#xA;  av_interleaved_write_frame(formatContext, &amp;tmcdPacket);&#xA;&#xA;  // Write trailer&#xA;  if (av_write_trailer(formatContext) &lt; 0) {&#xA;    std::cerr &lt;&lt; "Failed to write file trailer!" &lt;&lt; std::endl;&#xA;  }&#xA;&#xA;  av_dump_format(formatContext, 0, "test.mov", 1);&#xA;&#xA;  // Cleanup&#xA;  avcodec_free_context(&amp;videoCodecContext);&#xA;  avio_close(formatContext->pb);&#xA;  avformat_free_context(formatContext);&#xA;&#xA;  std::cout &lt;&lt; "Test file with timecode created successfully: " &lt;&lt; outputFileName &lt;&lt; std::endl;&#xA;&#xA;  return 0;&#xA;}&#xA;</iostream>

    &#xA;

    The code output is :

    &#xA;

    Creating test file with tmcd stream: test_tmcd.mov&#xA;[prores_ks @ 0x11ce05790] Autoselected HQ profile to keep best quality. It can be overridden through -profile option.&#xA;[mov @ 0x11ce04f20] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly&#xA;[mov @ 0x11ce04f20] Encoder did not produce proper pts, making some up.&#xA;Output #0, mov, to &#x27;test.mov&#x27;:&#xA;  Metadata:&#xA;    encoder         : Lavf61.7.100&#xA;  Stream #0:0: Video: prores (HQ) (apch / 0x68637061), yuv422p10le, 1920x1080, q=2-31, 2000 kb/s, 15360 tbn&#xA;  Stream #0:1: Data: timed_id3 (tmcd / 0x64636D74)&#xA;      Metadata:&#xA;        timecode        : 00:00:30:00&#xA;Test file with timecode created successfully: test_tmcd.mov&#xA;

    &#xA;

    The ffprobe output is :

    &#xA;

    $ ffprobe  test_tmcd.mov&#xA;ffprobe version 7.1.1 Copyright (c) 2007-2025 the FFmpeg developers&#xA;  built with Apple clang version 16.0.0 (clang-1600.0.26.6)&#xA;  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags=&#x27;-Wl,-ld_classic&#x27; --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon&#xA;  libavutil      59. 39.100 / 59. 39.100&#xA;  libavcodec     61. 19.101 / 61. 19.101&#xA;  libavformat    61.  7.100 / 61.  7.100&#xA;  libavdevice    61.  3.100 / 61.  3.100&#xA;  libavfilter    10.  4.100 / 10.  4.100&#xA;  libswscale      8.  3.100 /  8.  3.100&#xA;  libswresample   5.  3.100 /  5.  3.100&#xA;  libpostproc    58.  3.100 / 58.  3.100&#xA;Input #0, mov,mp4,m4a,3gp,3g2,mj2, from &#x27;test_tmcd.mov&#x27;:&#xA;  Metadata:&#xA;    major_brand     : qt  &#xA;    minor_version   : 512&#xA;    compatible_brands: qt  &#xA;    encoder         : Lavf61.7.100&#xA;  Duration: N/A, start: 0.000000, bitrate: N/A&#xA;  Stream #0:0[0x1]: Video: prores (HQ) (apch / 0x68637061), yuv422p10le, 1920x1080, 15360 tbn (default)&#xA;      Metadata:&#xA;        handler_name    : VideoHandler&#xA;        vendor_id       : FFMP&#xA;$ &#xA;&#xA;

    &#xA;

    Spent hours with all AI models, no help. Appeal to the human intelligence now

    &#xA;

  • NumPy array of a video changes from the original after writing into the same video

    29 mars 2021, par Rashiq

    I have a video (test.mkv) that I have converted into a 4D NumPy array - (frame, height, width, color_channel). I have even managed to convert that array back into the same video (test_2.mkv) without altering anything. However, after reading this new, test_2.mkv, back into a new NumPy array, the array of the first video is different from the second video's array i.e. their hashes don't match and the numpy.array_equal() function returns false. I have tried using both python-ffmpeg and scikit-video but cannot get the arrays to match.

    &#xA;

    Python-ffmpeg attempt :

    &#xA;

    import ffmpeg&#xA;import numpy as np&#xA;import hashlib&#xA;&#xA;file_name = &#x27;test.mkv&#x27;&#xA;&#xA;# Get video dimensions and framerate&#xA;probe = ffmpeg.probe(file_name)&#xA;video_stream = next((stream for stream in probe[&#x27;streams&#x27;] if stream[&#x27;codec_type&#x27;] == &#x27;video&#x27;), None)&#xA;width = int(video_stream[&#x27;width&#x27;])&#xA;height = int(video_stream[&#x27;height&#x27;])&#xA;frame_rate = video_stream[&#x27;avg_frame_rate&#x27;]&#xA;&#xA;# Read video into buffer&#xA;out, error = (&#xA;    ffmpeg&#xA;        .input(file_name, threads=120)&#xA;        .output("pipe:", format=&#x27;rawvideo&#x27;, pix_fmt=&#x27;rgb24&#x27;)&#xA;        .run(capture_stdout=True)&#xA;)&#xA;&#xA;# Convert video buffer to array&#xA;video = (&#xA;    np&#xA;        .frombuffer(out, np.uint8)&#xA;        .reshape([-1, height, width, 3])&#xA;)&#xA;&#xA;# Convert array to buffer&#xA;video_buffer = (&#xA;    np.ndarray&#xA;        .flatten(video)&#xA;        .tobytes()&#xA;)&#xA;&#xA;# Write buffer back into a video&#xA;process = (&#xA;    ffmpeg&#xA;        .input(&#x27;pipe:&#x27;, format=&#x27;rawvideo&#x27;, s=&#x27;{}x{}&#x27;.format(width, height))&#xA;        .output("test_2.mkv", r=frame_rate)&#xA;        .overwrite_output()&#xA;        .run_async(pipe_stdin=True)&#xA;)&#xA;process.communicate(input=video_buffer)&#xA;&#xA;# Read the newly written video&#xA;out_2, error = (&#xA;    ffmpeg&#xA;        .input("test_2.mkv", threads=40)&#xA;        .output("pipe:", format=&#x27;rawvideo&#x27;, pix_fmt=&#x27;rgb24&#x27;)&#xA;        .run(capture_stdout=True)&#xA;)&#xA;&#xA;# Convert new video into array&#xA;video_2 = (&#xA;    np&#xA;        .frombuffer(out_2, np.uint8)&#xA;        .reshape([-1, height, width, 3])&#xA;)&#xA;&#xA;# Video dimesions change&#xA;print(f&#x27;{video.shape} vs {video_2.shape}&#x27;) # (844, 1080, 608, 3) vs (2025, 1080, 608, 3)&#xA;print(f&#x27;{np.array_equal(video, video_2)}&#x27;) # False&#xA;&#xA;# Hashes don&#x27;t match&#xA;print(hashlib.sha256(bytes(video_2)).digest()) # b&#x27;\x88\x00\xc8\x0ed\x84!\x01\x9e\x08 \xd0U\x9a(\x02\x0b-\xeeA\xecU\xf7\xad0xa\x9e\\\xbck\xc3&#x27;&#xA;print(hashlib.sha256(bytes(video)).digest()) # b&#x27;\x9d\xc1\x07xh\x1b\x04I\xed\x906\xe57\xba\xf3\xf1k\x08\xfa\xf1\xfaM\x9a\xcf\xa9\t8\xf0\xc9\t\xa9\xb7&#x27;&#xA;

    &#xA;

    Scikit-video attempt :

    &#xA;

    import skvideo.io as sk&#xA;import numpy as np&#xA;&#xA;video_data = sk.vread(&#x27;test.mkv&#x27;)&#xA;&#xA;sk.vwrite(&#x27;test_2_ski.mkv&#x27;, video_data)&#xA;&#xA;video_data_2 = sk.vread(&#x27;test_2_ski.mkv&#x27;)&#xA;&#xA;# Dimensions match but...&#xA;print(video_data.shape) # (844, 1080, 608, 3)&#xA;print(video_data_2.shape) # (844, 1080, 608, 3)&#xA;&#xA;# ...array elements don&#x27;t&#xA;print(np.array_equal(video_data, video_data_2)) # False&#xA;&#xA;# Hashes don&#x27;t match either&#xA;print(hashlib.sha256(bytes(video_2)).digest()) # b&#x27;\x8b?]\x8epD:\xd9B\x14\xc7\xba\xect\x15G\xfaRP\xde\xad&amp;EC\x15\xc3\x07\n{a[\x80&#x27;&#xA;print(hashlib.sha256(bytes(video)).digest()) # b&#x27;\x9d\xc1\x07xh\x1b\x04I\xed\x906\xe57\xba\xf3\xf1k\x08\xfa\xf1\xfaM\x9a\xcf\xa9\t8\xf0\xc9\t\xa9\xb7&#x27;&#xA;

    &#xA;

    I don't understand where I'm going wrong and both the respective documentations do not highlight how to do this particular task. Any help is appreciated. Thank you.

    &#xA;

  • FFmpeg get frame rate

    22 septembre 2021, par zhin dins

    I have several images and I am reproducing them in 78.7ms, I am creating like the 80s video effect. But, I am unable to find the correct ms, and this images with the original videos are unsync.

    &#xA;

    I dumped the video to images using this command => ffmpeg -i *.mp4 the80effect/img-%d.jpg And now, I have 48622 frames. The video FPS is 24

    &#xA;

    So, 48622/24 = 2025 +- I cannot use 2025ms since those images will load very slow. And the and the approximate value is 78.7ms per frame/image

    &#xA;

    How can I find the correct value ? The video duration in seconds is 2026. I have tried all math to find this but I'm failing. How many images (one frame) per msCould you help me ? Thank you.

    &#xA;