Recherche avancée

Médias (1)

Mot : - Tags -/illustrator

Autres articles (50)

  • Qu’est ce qu’un masque de formulaire

    13 juin 2013, par

    Un masque de formulaire consiste en la personnalisation du formulaire de mise en ligne des médias, rubriques, actualités, éditoriaux et liens vers des sites.
    Chaque formulaire de publication d’objet peut donc être personnalisé.
    Pour accéder à la personnalisation des champs de formulaires, il est nécessaire d’aller dans l’administration de votre MediaSPIP puis de sélectionner "Configuration des masques de formulaires".
    Sélectionnez ensuite le formulaire à modifier en cliquant sur sont type d’objet. (...)

  • 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

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

Sur d’autres sites (8603)

  • Encoding AAC audio with libav

    14 mars 2018, par Michael IV

    I am trying to encode AAC using FFMPEG C libs. The closest thing I found on SO is this question,but it deals with mp4 container which has aac stream. That’s not what I am trying to do. I am encoding single audio file. Now, FFMPEG example for audio encoding doesn’t show aac and it is not clear if it is enough also for the aac codec. Here is how I do it :

    Setup :

       AVCodec*              mInputAudioCodec = NULL;  
       AVCodecContext*       mInputAudioCodecContext = NULL;
       AVPacket*             mAudioPacket = NULL;
       AVFrame*              mAudioInputFrame = NULL;

       mInputAudioCodec =  avcodec_find_encoder(AV_CODEC_ID_AAC);
       if (!mInputAudioCodec)
       {
           return false;
       }

       mInputAudioCodecContext = avcodec_alloc_context3(mInputAudioCodec);
       if (!mInputAudioCodecContext)
       {
           return false;
       }

       mInputAudioCodecContext->bit_rate = 192000;// 64000;
       mInputAudioCodecContext->sample_fmt = AV_SAMPLE_FMT_FLTP; AV_SAMPLE_FMT_S16;
       // check that a given sample format is supported by the encoder
       const enum AVSampleFormat *p = mInputAudioCodec->sample_fmts;
       bool formatSupported = false;
       while (*p != AV_SAMPLE_FMT_NONE)
       {
           if (*p == mInputAudioCodecContext->sample_fmt)
           {
               formatSupported = true;
               break;
           }
           p++;
       }
       if (formatSupported == false)
       {
           return false;
       }

       mInputAudioCodecContext->sample_rate = 48000;
       mInputAudioCodecContext->channel_layout = AV_CH_LAYOUT_STEREO;
       mInputAudioCodecContext->channels = av_get_channel_layout_nb_channels(mInputAudioCodecContext->channel_layout);
       //  open codec:
       if (avcodec_open2(mInputAudioCodecContext, mInputAudioCodec, NULL) < 0)
       {
           return false;
       }
       mAudioPacket = av_packet_alloc();
       mAudioInputFrame = av_frame_alloc();
       mAudioInputFrame->nb_samples     = mInputAudioCodecContext->frame_size;
       mAudioInputFrame->format         = mInputAudioCodecContext->sample_fmt;
       mAudioInputFrame->channel_layout = mInputAudioCodecContext->channel_layout;
       mAudioInputFrame->sample_rate    = mInputAudioCodecContext->sample_rate;
       if (av_frame_get_buffer(mAudioInputFrame, 0) < 0)
       {
           return false;
       }
       mFileOut = fopen("audio.aac","wb");

    Encoding :

    For the simplicity, I encode synthetic frames,just like in FFMPEG example.
    FLTP is planar format,so I write dummy data into two separate buffers.

       int ret = 0;
       ret = av_frame_make_writable(mAudioInputFrame);
       if (ret < 0)
       {
           return;
       }
            //generate sound data:
               float* samples0 = (float*)mAudioInputFrame->data[0];
               float* samples1 = (float*)mAudioInputFrame->data[1];
               float t = 0;
               float tincr = 2 * M_PI * 440.0f / mInputAudioCodecContext->sample_rate;
               for (int j = 0; j < mInputAudioCodecContext->frame_size; j++)
               {
                   *samples0 = (sin(t) * 10000);
                   *samples1 = (sin(t) * 10000);
                   samples0++;
                   samples1++;
                   t += tincr;
               }



               av_init_packet(mAudioPacket);
               mAudioPacket->data = NULL;
               mAudioPacket->size = 0;

               ret = avcodec_send_frame(mInputAudioCodecContext, mAudioInputFrame);
               if (ret < 0)
               {
                   fprintf(stderr, "Error sending the frame to the encoder\n");
               }

               /* read all the available output packets (in general there may be any
               * number of them */
               while (ret >= 0)
               {
                   ret = avcodec_receive_packet(mInputAudioCodecContext, mAudioPacket);
                   if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                   {
                       return;
                   }
                   else if (ret < 0)
                   {
                       return;
                   }

                   fwrite(mAudioPacket->data, 1, mAudioPacket->size, mFileOut);


               }

               av_packet_unref(mAudioPacket);

    The encoding session performs ok, avcodec lib doesn’t spit any warnings or errors. But the resulting .aac file is not opened neither by VLC nor by any other audio player. It is corrupted. I ran FFProbe on the file and here is what it says :

    [aac @ 000000000274b840] Format aac detected only with low score of 1,
    misdetection possible ! [aac @ 00000000026fb2e0] More than one AAC RDB
    per ADTS frame is not implemented. Update your FFmpeg version to the
    newest one from Git. If the problem still occurs, it means that your
    file has a feature which has not been implemented. [aac @
    00000000026fb2e0] Sample rate index in program config element does not
    match the sample rate index configured by the container. [aac @
    00000000026fb2e0] Inconsistent channel configuration. [aac @
    00000000026fb2e0] get_buffer() failed [aac @ 00000000026fb2e0] channel
    element 2.15 is not allocated [aac @ 00000000026fb2e0] Assuming an
    incorrectly encoded 7.1 channel layout instead of a spec-compliant
    7.1(wide) layout, use -strict 1 to decode according to the specification instead. [aac @ 00000000026fb2e0] Multiple frames in a
    packet. [aac @ 00000000026fb2e0] Number of scalefactor bands in group
    (53) exceeds limit (51). [aac @ 00000000026fb2e0] channel element 2.1
    is not allocated [aac @ 000000000274b840] decoding for stream 0 failed
    [aac @ 000000000274b840] Estimating duration from bitrate, this may be
    inaccurate [aac @ 000000000274b840] Could not find codec parameters
    for stream 0 (Audio : aac (SSR), stereo, fltp, 254 kb/s) : unspecified
    sample rate Consider increasing the value for the ’analyzeduration’
    and ’probesize’ options Input #0, aac, from ’audio.aac’ : Duration :
    00:00:03.21, bitrate : 254 kb/s
    Stream #0:0 : Audio : aac (SSR), stereo, fltp, 254 kb/s

    What am I doing wrong here ?

  • trying to read .smp stream using ffmpeg over windows cmd

    15 décembre 2022, par Moayad Rayyan

    Am trying to read the stream over windows CMD using ffmpeg.
I am able to stream the same link to VLC Player but Cmd showing bellow error.

    


    The camera used here is : **Hanwha **

    


    So when i run this command, there is error "Invalid data found when processing input"

    


    How to tell ffmjpeg to identify this type of stream.

    


    Command :

    


    ffmpeg -i rtsp://admin:******@10.82.0.165:80/profile1/media.smp -loglevel 99


    


    Command Result :

    


    ffmpeg version 2022-12-11-git-c3e20f78b0-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 43.100 / 57. 43.100
  libavcodec     59. 55.100 / 59. 55.100
  libavformat    59. 34.102 / 59. 34.102
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 52.100 /  8. 52.100
  libswscale      6.  8.112 /  6.  8.112
  libswresample   4.  9.100 /  4.  9.100
  libpostproc    56.  7.100 / 56.  7.100
Splitting the commandline.
Reading option '-codec' ... matched as option 'codec' (codec name) with argument 'hevc'.
Reading option '-i' ... matched as input url with argument 'rtsp://admin:*******@10.82.0.165:80/profile1/media.smp'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument '99'.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument 99.
Successfully parsed a group of options.
Parsing a group of options: input url rtsp://admin:******@10.82.0.165:80/profile1/media.smp.
Applying option codec (codec name) with argument hevc.
Successfully parsed a group of options.
Opening an input file: rtsp://admin:******@10.82.0.165:80/profile1/media.smp.
Probing rtsp score:100 size:0
[tcp @ 000001ce22e0f0c0] No default whitelist set
[tcp @ 000001ce22e0f0c0] Original list of addresses:
[tcp @ 000001ce22e0f0c0] Address 10.82.0.165 port 80
[tcp @ 000001ce22e0f0c0] Interleaved list of addresses:
[tcp @ 000001ce22e0f0c0] Address 10.82.0.165 port 80
[tcp @ 000001ce22e0f0c0] Starting connection attempt to 10.82.0.165 port 80
[tcp @ 000001ce22e0f0c0] Successfully connected to 10.82.0.165 port 80
[rtsp @ 000001ce22e0e800] Sending:
OPTIONS rtsp://10.82.0.165:80/profile1/media.smp RTSP/1.0
CSeq: 1
User-Agent: Lavf59.34.102

--
[rtsp @ 000001ce22e0e800] ret=1 c=48 [H]
[rtsp @ 000001ce22e0e800] ret=1 c=54 [T]
    Last message repeated 1 times
[rtsp @ 000001ce22e0e800] ret=1 c=50 [P]
[rtsp @ 000001ce22e0e800] ret=1 c=2f [/]
[rtsp @ 000001ce22e0e800] ret=1 c=31 [1]
[rtsp @ 000001ce22e0e800] ret=1 c=2e [.]
[rtsp @ 000001ce22e0e800] ret=1 c=30 [0]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=34 [4]
[rtsp @ 000001ce22e0e800] ret=1 c=30 [0]
    Last message repeated 1 times
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=42 [B]
[rtsp @ 000001ce22e0e800] ret=1 c=61 [a]
[rtsp @ 000001ce22e0e800] ret=1 c=64 [d]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=52 [R]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=71 [q]
[rtsp @ 000001ce22e0e800] ret=1 c=75 [u]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=73 [s]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='HTTP/1.0 400 Bad Request'
[rtsp @ 000001ce22e0e800] ret=1 c=43 [C]
[rtsp @ 000001ce22e0e800] ret=1 c=6f [o]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=2d [-]
[rtsp @ 000001ce22e0e800] ret=1 c=54 [T]
[rtsp @ 000001ce22e0e800] ret=1 c=79 [y]
[rtsp @ 000001ce22e0e800] ret=1 c=70 [p]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=78 [x]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=2f [/]
[rtsp @ 000001ce22e0e800] ret=1 c=68 [h]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=6d [m]
[rtsp @ 000001ce22e0e800] ret=1 c=6c [l]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='Content-Type: text/html'
[rtsp @ 000001ce22e0e800] ret=1 c=43 [C]
[rtsp @ 000001ce22e0e800] ret=1 c=6f [o]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=2d [-]
[rtsp @ 000001ce22e0e800] ret=1 c=4c [L]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=67 [g]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=68 [h]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=33 [3]
[rtsp @ 000001ce22e0e800] ret=1 c=34 [4]
[rtsp @ 000001ce22e0e800] ret=1 c=39 [9]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='Content-Length: 349'
[rtsp @ 000001ce22e0e800] ret=1 c=43 [C]
[rtsp @ 000001ce22e0e800] ret=1 c=6f [o]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
    Last message repeated 1 times
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=63 [c]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=69 [i]
[rtsp @ 000001ce22e0e800] ret=1 c=6f [o]
[rtsp @ 000001ce22e0e800] ret=1 c=6e [n]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=63 [c]
[rtsp @ 000001ce22e0e800] ret=1 c=6c [l]
[rtsp @ 000001ce22e0e800] ret=1 c=6f [o]
[rtsp @ 000001ce22e0e800] ret=1 c=73 [s]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='Connection: close'
[rtsp @ 000001ce22e0e800] ret=1 c=44 [D]
[rtsp @ 000001ce22e0e800] ret=1 c=61 [a]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=54 [T]
[rtsp @ 000001ce22e0e800] ret=1 c=68 [h]
[rtsp @ 000001ce22e0e800] ret=1 c=75 [u]
[rtsp @ 000001ce22e0e800] ret=1 c=2c [,]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=31 [1]
[rtsp @ 000001ce22e0e800] ret=1 c=35 [5]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=44 [D]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=63 [c]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=32 [2]
[rtsp @ 000001ce22e0e800] ret=1 c=30 [0]
[rtsp @ 000001ce22e0e800] ret=1 c=32 [2]
    Last message repeated 1 times
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=30 [0]
[rtsp @ 000001ce22e0e800] ret=1 c=38 [8]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=31 [1]
[rtsp @ 000001ce22e0e800] ret=1 c=32 [2]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=35 [5]
[rtsp @ 000001ce22e0e800] ret=1 c=32 [2]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=47 [G]
[rtsp @ 000001ce22e0e800] ret=1 c=4d [M]
[rtsp @ 000001ce22e0e800] ret=1 c=54 [T]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='Date: Thu, 15 Dec 2022 08:12:52 GMT'
[rtsp @ 000001ce22e0e800] ret=1 c=53 [S]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=72 [r]
[rtsp @ 000001ce22e0e800] ret=1 c=76 [v]
[rtsp @ 000001ce22e0e800] ret=1 c=65 [e]
[rtsp @ 000001ce22e0e800] ret=1 c=72 [r]
[rtsp @ 000001ce22e0e800] ret=1 c=3a [:]
[rtsp @ 000001ce22e0e800] ret=1 c=20 [ ]
[rtsp @ 000001ce22e0e800] ret=1 c=6c [l]
[rtsp @ 000001ce22e0e800] ret=1 c=69 [i]
[rtsp @ 000001ce22e0e800] ret=1 c=67 [g]
[rtsp @ 000001ce22e0e800] ret=1 c=68 [h]
[rtsp @ 000001ce22e0e800] ret=1 c=74 [t]
    Last message repeated 1 times
[rtsp @ 000001ce22e0e800] ret=1 c=70 [p]
[rtsp @ 000001ce22e0e800] ret=1 c=64 [d]
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line='Server: lighttpd'
]rtsp @ 000001ce22e0e800] ret=1 c=0d [
[rtsp @ 000001ce22e0e800] ret=1 c=0a [
]
[rtsp @ 000001ce22e0e800] line=''
[rtsp @ 000001ce22e0e800] ret=-541478725 c=0a [
]
rtsp://admin:********@10.82.0.165:80/profile1/media.smp: Invalid data found when processing input


    


  • Add coverart into ogg containing an opus audio stream with ffmpeg without re-encoding the audio stream

    12 décembre 2023, par SebMa

    I'm trying to add a coverart into an ogg file with ffmpeg :


    



    Here are my source.ogg and source.jpg files :

    



    $ ffprobe -hide_banner source.ogg 
Input #0, ogg, from 'source.ogg':
  Duration: 00:03:02.45, start: 0.007500, bitrate: 73 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
$ identify source.jpg 
source.jpg JPEG 480x360 480x360+0+0 8-bit DirectClass 15.1KB 0.000u 0:00.000


    



    I tried this :

    



    $ ffmpeg -hide_banner -i source.ogg -i source.jpg -map 0 -map 1 -c:a copy -c copy -map_metadata 0 dest.ogg -y && echo && ffprobe -hide_banner dest.ogg 
Input #0, ogg, from 'source.ogg':
  Duration: 00:03:02.45, start: 0.007500, bitrate: 73 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
Input #1, image2, from 'source.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 3023 kb/s
    Stream #1:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x360 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
[ogg @ 0x5655578064c0] Unsupported codec id in stream 1
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
    Last message repeated 1 times
[ogg @ 0x5655577e8540] Format ogg detected only with low score of 1, misdetection possible!
dest.ogg: End of file


    



    I've also found this answer but it does not explain how to do it with ffmpeg.

    



    I've read about a "METADATA_BLOCK_PICTURE" metadata in the ogg container that might contain the picture in base64, so I tried this :

    



    $ ffmpeg -hide_banner -i source.ogg -map 0 -c:a copy -c copy -metadata METADATA_BLOCK_PICTURE="$(base64 source.jpg)" dest.ogg
Input #0, ogg, from 'source.ogg':
  Duration: 00:03:02.45, start: 0.007500, bitrate: 73 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
File 'dest.ogg' already exists. Overwrite ? [y/N] y
Output #0, ogg, to 'dest.ogg':
  Metadata:
    METADATA_BLOCK_PICTURE: /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz
                    : ODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj
                    ..............................................................................
                    : nVmaS2E/urUWVbH6ORI9z2l8zyRfFpkLooIHSBuk9lFFoC6OBnP1SON8rEooqM2WOVHDdRRAAUVK
                    : KiiCWRRRRBJ//9k=
    encoder         : Lavf58.20.100
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
      METADATA_BLOCK_PICTURE: /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz
                      : ODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj
                      : Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED
                      ..............................................................................
                      : nVmaS2E/urUWVbH6ORI9z2l8zyRfFpkLooIHSBuk9lFFoC6OBnP1SON8rEooqM2WOVHDdRRAAUVK
                      : KiiCWRRRRBJ//9k=
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=    1658kB time=00:03:02.41 bitrate=  74.5kbits/s speed=1.01e+03x    
video:0kB audio:1624kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.100392%


    



    It kinda "worked", but neither ffplay nor mpv can parse the cover art :

    



    $ ffplay -hide_banner dest.ogg
[ogg @ 0x5655577e8540] Failed to parse cover art block.
Input #0, ogg, from 'dest.ogg':
  Duration: 00:03:02.44, start: 0.000000, bitrate: 74 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
   3.95 M-A: -0.000 fd=   0 aq=   14KB vq=    0KB sq=    0B f=0/0    
$ mpv dest.ogg 
Playing: dest.ogg
[ffmpeg/demuxer] ogg: Failed to parse cover art block.
 (+) Audio --aid=1 (opus 2ch 48000Hz)
AO: [pulse] 48000Hz stereo 2ch float
A: 00:00:03 / 00:03:02 (2%)


Exiting... (Quit)


    



    I alse tried -metadata:s:a along with the --wrap 0 of base64 (which I had forgotten to specify, oops :) ) :

    



    $ ffmpeg -i source.ogg -map 0 -c:a copy -c copy -metadata:s:a METADATA_BLOCK_PICTURE="$(base64 --wrap 0 source.jpg)" dest.ogg
Input #0, ogg, from 'source.ogg':
  Duration: 00:03:02.45, start: 0.007500, bitrate: 73 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
File 'dest.ogg' already exists. Overwrite ? [y/N] y
Output #0, ogg, to 'dest.ogg':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100
      METADATA_BLOCK_PICTURE: /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQEDEQH/xAAaAAACAwEBAAAAAAAAAAA
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=    1658kB time=00:03:02.41 bitrate=  74.5kbits/s speed=1.22e+03x    
video:0kB audio:1624kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.084397%


    



    But still the dest.ogg jpg coverart cannot be read properly :

    



    $ ffprobe -hide_banner dest.ogg 
[ogg @ 0x5655577e8540] Invalid picture type: -2555936.
[ogg @ 0x5655577e8540] Could not read mimetype from an attached picture.
Input #0, ogg, from 'dest.ogg':
  Duration: 00:03:02.44, start: 0.000000, bitrate: 74 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
    Metadata:
      DURATION        : 00:03:02.441000000
      ENCODER         : Lavf58.20.100


    



    Can you please help me ?