Recherche avancée

Médias (1)

Mot : - Tags -/bug

Autres articles (68)

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

  • Keeping control of your media in your hands

    13 avril 2011, par

    The vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
    While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
    MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
    MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)

  • 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

Sur d’autres sites (12058)

  • The ffmpeg webm_dash_manifest demuxer fails with webvtt subtitles

    30 janvier 2020, par Hyldrean

    I am trying to create a DASH manifest using ffmpeg and I encounter some difficulties with the subtitles. I get the error

    [webm_dash_manifest @ 0x55e19db48180] EBML header parsing failed
    [webm_dash_manifest @ 0x55e19db48180] Failed to read file headers
    subtitles.vtt: Operation not permitted

    The subtitles are encoded in the plain text webvtt format. I first assume that the EBML header are missing because the subtitles were not contained in a webm container. I then tried to create a webm file containing only the subtitles. It appears impossible.

    I think the problem comes from the webm_dash_manifest demuxer. It seeks metadata in a file with no metadata. However neither Google nor Stack Overflow give me an answer.

    The command I used :

    ffmpeg \
    -f webm_dash_manifest -i video.webm \
    -f webm_dash_manifest -i audio.webm \
    -f webm_dash_manifest -i subtitles.vtt \
    -map 0 -map 1 -map 2 \
    -c copy \
    -f webm_dash_manifest \
    -adaptation_sets "id=0,streams=0 id=1,streams=1 id=2,stream=2" \
    minimal.mpd

    and the ffmpeg output :

    ffmpeg version 3.2.14-1~deb9u1 Copyright (c) 2000-2019 the FFmpeg developers
     built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
     configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
     libavutil      55. 34.101 / 55. 34.101
     libavcodec     57. 64.101 / 57. 64.101
     libavformat    57. 56.101 / 57. 56.101
     libavdevice    57.  1.100 / 57.  1.100
     libavfilter     6. 65.100 /  6. 65.100
     libavresample   3.  1.  0 /  3.  1.  0
     libswscale      4.  2.100 /  4.  2.100
     libswresample   2.  3.100 /  2.  3.100
     libpostproc    54.  1.100 / 54.  1.100
    [webm_dash_manifest @ 0x55e19db17160] Could not find codec parameters for stream 0 (Video: vp9, none, 1280x534): unspecified pixel format
    Consider increasing the value for the 'analyzeduration' and 'probesize' options
    Input #0, webm_dash_manifest, from 'video.webm':
     Metadata:
       title           : Cloud Atlas
       ENCODER         : Lavf58.35.104
     Duration: 00:05:00.01, bitrate: 998 kb/s
       Chapter #0:0: start 0.000000, end 300.000000
       Metadata:
         title           : Chapter 01
       Stream #0:0(eng): Video: vp9, none, 1280x534, SAR 1:1 DAR 640:267, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default) (forced)
       Metadata:
         title           : Video @ 6.9 Mbps [frame B:188517 Avg QP:20.66]
         ENCODER         : Lavc58.66.100 libvpx-vp9
         DURATION        : 00:05:00.008000000
         webm_dash_manifest_duration: 300008
         webm_dash_manifest_initialization_range: 900
         webm_dash_manifest_file_name: video.webm
         webm_dash_manifest_track_number: 1
         webm_dash_manifest_cues_start: 37455991
         webm_dash_manifest_cues_end: 37457486
         webm_dash_manifest_bandwidth: 1420427
         webm_dash_manifest_cluster_keyframe: 1
         webm_dash_manifest_cue_timestamps: 298715
    Input #1, webm_dash_manifest, from 'audio.webm':
     Metadata:
       title           : Cloud Atlas
       ENCODER         : Lavf58.35.104
     Duration: 00:05:00.01, bitrate: 126 kb/s
       Chapter #1:0: start 0.000000, end 300.000000
       Metadata:
         title           : Chapter 01
       Stream #1:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
       Metadata:
         title           : Audio Eng DTS 5.1 channels 24 bits @ 1509 Kbps cbr
         ENCODER         : Lavc58.66.100 libopus
         DURATION        : 00:05:00.007000000
         webm_dash_manifest_duration: 300007
         webm_dash_manifest_initialization_range: 838
         webm_dash_manifest_file_name: audio.webm
         webm_dash_manifest_track_number: 1
         webm_dash_manifest_cues_start: 4744091
         webm_dash_manifest_cues_end: 4745279
         webm_dash_manifest_bandwidth: 137531
         webm_dash_manifest_cluster_keyframe: 1
         webm_dash_manifest_cue_timestamps: 295000
    [webm_dash_manifest @ 0x55e19db48180] EBML header parsing failed
    [webm_dash_manifest @ 0x55e19db48180] Failed to read file headers
    subtitles.vtt: Operation not permitted

    I noticed that ffmpeg -f webm_dash_manifest -i subtitles.vtt suffices to reproduce the error.

    I have also tried without the -f webm_dash_manifest flag, with no success :

    ffmpeg \
    -f webm_dash_manifest -i video.webm \
    -f webm_dash_manifest -i audio.webm \
    -i subtitles.vtt \
    -map 0 -map 1 -map 2 \
    -c copy \
    -f webm_dash_manifest \
    -adaptation_sets "id=0,streams=0 id=1,streams=1 id=2,stream=2" minimal.mpd

    Output :

    ffmpeg version 3.2.14-1~deb9u1 Copyright (c) 2000-2019 the FFmpeg developers
     built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
     configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
     libavutil      55. 34.101 / 55. 34.101
     libavcodec     57. 64.101 / 57. 64.101
     libavformat    57. 56.101 / 57. 56.101
     libavdevice    57.  1.100 / 57.  1.100
     libavfilter     6. 65.100 /  6. 65.100
     libavresample   3.  1.  0 /  3.  1.  0
     libswscale      4.  2.100 /  4.  2.100
     libswresample   2.  3.100 /  2.  3.100
     libpostproc    54.  1.100 / 54.  1.100
    [webm_dash_manifest @ 0x557f55dd1160] Could not find codec parameters for stream 0 (Video: vp9, none, 1280x534): unspecified pixel format
    Consider increasing the value for the 'analyzeduration' and 'probesize' options
    Input #0, webm_dash_manifest, from 'video.webm':
     Metadata:
       title           : Cloud Atlas
       ENCODER         : Lavf58.35.104
     Duration: 00:05:00.01, bitrate: 998 kb/s
       Chapter #0:0: start 0.000000, end 300.000000
       Metadata:
         title           : Chapter 01
       Stream #0:0(eng): Video: vp9, none, 1280x534, SAR 1:1 DAR 640:267, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default) (forced)
       Metadata:
         title           : Video @ 6.9 Mbps [frame B:188517 Avg QP:20.66]
         ENCODER         : Lavc58.66.100 libvpx-vp9
         DURATION        : 00:05:00.008000000
         webm_dash_manifest_duration: 300008
         webm_dash_manifest_initialization_range: 900
         webm_dash_manifest_file_name: video.webm
         webm_dash_manifest_track_number: 1
         webm_dash_manifest_cues_start: 37455991
         webm_dash_manifest_cues_end: 37457486
         webm_dash_manifest_bandwidth: 1420427
         webm_dash_manifest_cluster_keyframe: 1
         webm_dash_manifest_cue_timestamps: 298715
    Input #1, webm_dash_manifest, from 'audio.webm':
     Metadata:
       title           : Cloud Atlas
       ENCODER         : Lavf58.35.104
     Duration: 00:05:00.01, bitrate: 126 kb/s
       Chapter #1:0: start 0.000000, end 300.000000
       Metadata:
         title           : Chapter 01
       Stream #1:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
       Metadata:
         title           : Audio Eng DTS 5.1 channels 24 bits @ 1509 Kbps cbr
         ENCODER         : Lavc58.66.100 libopus
         DURATION        : 00:05:00.007000000
         webm_dash_manifest_duration: 300007
         webm_dash_manifest_initialization_range: 838
         webm_dash_manifest_file_name: audio.webm
         webm_dash_manifest_track_number: 1
         webm_dash_manifest_cues_start: 4744091
         webm_dash_manifest_cues_end: 4745279
         webm_dash_manifest_bandwidth: 137531
         webm_dash_manifest_cluster_keyframe: 1
         webm_dash_manifest_cue_timestamps: 295000
    Input #2, webvtt, from 'subtitles.vtt':
     Duration: N/A, bitrate: N/A
       Stream #2:0: Subtitle: webvtt
    Could not write header for output file #0 (incorrect codec parameters ?): Operation not permittedStream mapping:
     Stream #0:0 -> #0:0 (copy)
     Stream #1:0 -> #0:1 (copy)
     Stream #2:0 -> #0:2 (copy)
       Last message repeated 1 times

    Note : [webm_dash_manifest @ 0x557f55dd1160] Could not find codec parameters for stream 0 (Video: vp9, none, 1280x534): unspecified pixel format is harmless according to this post.

    The subtitles have been extracted with ffmpeg :

    ffmpeg -i "Cloud Atlas.mkv" -map 0:6 -t 00:05:00 -c:s webvtt -dash 1 subtitles.vtt

    Thank you for reading my long post, I have no idea what to do next.

    EDIT : The WebM Project website says : ’Initial WebM release does not support subtitles’. Has someone heard of a new release ? Or a convenient way to create DASH manifest with subtitles ?

  • Cannot play local RTP stream

    24 janvier 2020, par gdogg371

    I have been struggling along with this issue now for a while, but am making good progress. I now have a 4k transport stream running using the below command line arguments for VLC :

    vlc --ffmpeg-hw --avcodec-hw=any dshow:// :dshow-vdev="Video (00 Pro Capture HDMI 4K+)" :dshow-adev="Audio (2- 00 Pro Capture HDMI 4K+)" :dshow-threads=8 :dshow-aspect-ratio=16\:9 :dshow-size="3840x2160" :dshow-pixel_format=yuv444p16le :dshow-tune=film :dshow-preset=lossless :dshow-profile=main10 show-vcodec=hevc_nvenc :dshow-fps=50 :dshow-crf=0 :dshow-acodec=mp4a :dshow-stereo-mode=5 :dshow-force-surround-sound=0 :dshow-ab=128 :dshow-samplerate=44100 :no-dshow-config :live-caching=3000 --sout "#transcode{venc=ffmpeg,vcodec=mpgv,threads=8,aspect=16:9,width=3840,height=2160,fps=50,acodec=a52,ab=1500,channels=6,samplerate=48000,soverlay}:rtp{dst=239.255.0.1,port=5004,mux=ts}"

    I can access the rtp stream on the same PC as I am running the stream from with the below :

    vlc -vvv rtp://@239.255.0.1:5004

    However, if I try the same commands on a different computer, connected via Ethernet to the same network, the client VLC session just hangs. I have included the log below with the verbosity set to debug. Can anyone spot anything in here suggesting why the stream won’t play ?

    -- logger module started --
    main debug: VLC media player - 3.0.8 Vetinari
    main debug: Copyright © 1996-2019 the VideoLAN team
    main debug: revision 3.0.8-0-gf350b6b5a7
    main debug: configured with ../extras/package/win32/../../../configure  '--enable-update-check' '--enable-lua' '--enable-faad' '--enable-flac' '--enable-theora' '--enable-avcodec' '--enable-merge-ffmpeg' '--enable-dca' '--enable-mpc' '--enable-libass' '--enable-schroedinger' '--enable-realrtsp' '--enable-live555' '--enable-dvdread' '--enable-shout' '--enable-goom' '--enable-caca' '--enable-qt' '--enable-skins2' '--enable-sse' '--enable-mmx' '--enable-libcddb' '--enable-zvbi' '--disable-telx' '--enable-nls' '--host=x86_64-w64-mingw32' '--with-breakpad=https://win.crashes.videolan.org' 'host_alias=x86_64-w64-mingw32' 'PKG_CONFIG_LIBDIR=/home/jenkins/workspace/vlc-release/windows/vlc-release-win32-x64/contrib/x86_64-w64-mingw32/lib/pkgconfig'
    main debug: using multimedia timers as clock source
    main debug:  min period: 1 ms, max period: 1000000 ms
    main debug: searching plug-in modules
    main debug: loading plugins cache file D:\VLC\plugins\plugins.dat
    main debug: recursively browsing `D:\VLC\plugins'
    main error: stale plugins cache: modified D:\VLC\plugins\access\libaccess_concat_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\access\libaccess_imem_plugin.dll
    ....
    ....
    ....
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libgoom_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libprojectm_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libvisual_plugin.dll
    main debug: plug-ins loaded: 494 modules
    main debug: opening config file (C:\Users\cg371\AppData\Roaming\vlc\vlcrc)
    main debug: looking for logger module matching "any": 2 candidates
    file debug: opening logfile `D:\VLC\Log.txt'
    main debug: using logger module "file"
    main debug: translation test: code is "en_GB"
    main debug: looking for keystore module matching "memory": 3 candidates
    main debug: using keystore module "memory"
    main debug: CPU has capabilities MMX MMXEXT SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 FPU
    main debug: Creating an input for 'Media Library'
    main debug: Input is a meta file: disabling unneeded options
    main debug: using timeshift granularity of 50 MiB
    main debug: using timeshift path: C:\Users\cg371\AppData\Local\Temp
    main debug: `file/directory:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' gives access `file' demux `directory' path `/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf'
    main debug: creating demux: access='file' demux='directory' location='/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' file='C:\Users\cg371\AppData\Roaming\vlc\ml.xspf'
    main debug: looking for access_demux module matching "file": 15 candidates
    main debug: no access_demux modules matched
    main debug: creating access: file:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf
    main debug:  (path: C:\Users\cg371\AppData\Roaming\vlc\ml.xspf)
    main debug: looking for access module matching "file": 26 candidates
    main debug: using access module "filesystem"
    main debug: looking for stream_filter module matching "prefetch,cache_read": 24 candidates
    cache_read debug: Using stream method for AStream*
    cache_read debug: starting pre-buffering
    cache_read debug: received first data after 1 ms
    cache_read debug: pre-buffering done 304 bytes in 0s - 296 KiB/s
    main debug: using stream_filter module "cache_read"
    main debug: looking for stream_filter module matching "any": 24 candidates
    playlist debug: using XSPF playlist reader
    main debug: using stream_filter module "playlist"
    main debug: stream filter added to 00000266f6927700
    main debug: looking for stream_filter module matching "any": 24 candidates
    main debug: no stream_filter modules matched
    main debug: looking for stream_directory module matching "any": 1 candidates
    main debug: no stream_directory modules matched
    main debug: attachment of directory-extractor failed for file:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf
    main debug: looking for stream_filter module matching "record": 24 candidates
    main debug: using stream_filter module "record"
    main debug: creating demux: access='file' demux='directory' location='/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' file='C:\Users\cg371\AppData\Roaming\vlc\ml.xspf'
    main debug: looking for demux module matching "directory": 55 candidates
    main debug: using demux module "directory"
    main debug: looking for meta reader module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\reader
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\reader
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\reader\filename.luac
    main debug: no meta reader modules matched
    main debug: `file/directory:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' successfully opened
    main debug: looking for xml reader module matching "any": 1 candidates
    main debug: using xml reader module "xml"
    main debug: EOF reached
    main debug: removing module "directory"
    main debug: removing module "record"
    main debug: removing module "playlist"
    main debug: removing module "cache_read"
    main debug: removing module "filesystem"
    main debug: creating audio output
    main debug: looking for audio output module matching "any": 6 candidates
    mmdevice debug: using default device
    mmdevice debug: display name changed: VLC media player (LibVLC 3.0.8)
    mmdevice debug: version 2 session control unavailable
    mmdevice debug: volume from -65.250000 dB to +0.000000 dB with 0.031250 dB increments
    main debug: using audio output module "mmdevice"
    main debug: keeping audio output
    main debug: looking for interface module matching "hotkeys,none": 16 candidates
    main debug: using interface module "hotkeys"
    main debug: looking for interface module matching "globalhotkeys,none": 16 candidates
    main debug: using interface module "win32"
    main: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
    main debug: looking for interface module matching "any": 16 candidates
    main debug: looking for extension module matching "any": 1 candidates
    lua debug: Opening Lua Extension module
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\extensions
    lua debug: Trying Lua scripts in D:\VLC\lua\extensions
    lua debug: Trying Lua playlist script D:\VLC\lua\extensions\VLSub.luac
    lua debug: Scanning Lua script D:\VLC\lua\extensions\VLSub.luac
    lua debug: Script D:\VLC\lua\extensions\VLSub.luac has the following capability flags: 0x5
    main debug: using extension module "lua"
    main debug: using interface module "qt"
    main debug: processing request item: null, node: Playlist, skip: 0
    main debug: rebuilding array of current - root Playlist
    main debug: rebuild done - 1 items, index -1
    main debug: starting playback of new item
    main debug: resyncing on rtp://239.255.0.1:5004
    main debug: rtp://239.255.0.1:5004 is at 0
    main debug: creating new input thread
    main debug: Creating an input for 'rtp://239.255.0.1:5004'
    main debug: requesting art for new input thread
    main debug: using timeshift granularity of 50 MiB
    main debug: using timeshift path: C:\Users\cg371\AppData\Local\Temp
    main debug: `rtp://@239.255.0.1:5004' gives access `rtp' demux `any' path `@239.255.0.1:5004'
    main debug: creating demux: access='rtp' demux='any' location='@239.255.0.1:5004' file='\\@239.255.0.1:5004'
    main debug: looking for access_demux module matching "rtp": 15 candidates
    main debug: net: opening 239.255.0.1 datagram port 5004
    qt debug: IM: Setting an input
    main debug: looking for meta fetcher module matching "any": 1 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\fetcher
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\fetcher
    main debug: no meta fetcher modules matched
    main debug: looking for art finder module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\art
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\art
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: using access_demux module "rtp"
    main debug: looking for meta reader module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\reader
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\reader
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\reader\filename.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: no art finder modules matched
    main debug: no meta reader modules matched
    main debug: `rtp://@239.255.0.1:5004' successfully opened
    main debug: looking for meta fetcher module matching "any": 1 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\fetcher
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\fetcher
    main debug: no meta fetcher modules matched
    main debug: looking for art finder module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\art
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\art
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: no art finder modules matched
    main debug: exiting
    main debug: exiting
    main debug: no exit handler
    main debug: removing all interfaces
    main debug: removing module "qt"
    main debug: deactivating the playlist
    main debug: incoming request - stopping current input
    main debug: removing module "rtp"
    main debug: dead input
    main debug: nothing to play
    main debug: removing module "mmdevice"
    qt debug: requesting exit...
    qt debug: waiting for UI thread...
    qt debug: IM: Deleting the input
    qt debug: QApp exec() finished
    qt debug: Video is not needed anymore
    qt debug: Killing extension dialog provider
    qt debug: ExtensionsDialogProvider is quitting...
    main debug: removing module "lua"
    main debug: removing module "win32"
    main debug: removing module "hotkeys"
    main debug: destroying
    main debug: saving media library to file C:\Users\cg371\AppData\Roaming\vlc\ml.xspf.tmp14968
    main debug: looking for playlist export module matching "export-xspf": 4 candidates
    main debug: using playlist export module "export"
    main debug: removing module "export"
    main debug: deleting item `Media Library'
    main debug: deleting item `rtp://239.255.0.1:5004'
    main debug: deleting item `Playlist'
    main debug: removing module "memory"
    -- logger module stopped --
  • Libav/ffmpeg api duplicates first frame of mp4 video and makes it second frame

    22 janvier 2020, par Optic_Ray

    I am making video mp4 file from couple of jpg image files with different sizes present as sample< number >.jpg (sample1.jpg, sample2.jpg, etc) in a folder. I modified ffmpeg muxing.c example to make it create mp4 file from these set of jpg images(for frames) and also modified it to create only video stream(no audio stream). It is able to create mp4 file with n video frames from n different jpg image files, but mp4 file it outputs when n=2 isn’t as expected. I have tried from n=1 to n=7 so far. When n=2 mp4 file is created but I could see only first jpg image as frame in the entire video. It appears as if first frame(first jpg image) is duplicated and used as second frame too, as I just can’t find image of second jpg image file when I play the video. When I make video with 2 frames from 2 different jpg files, I want first frame to be first jpg image and second frame to be second jpg image. How do I achieve that ?

    ffmpeg configuration :

    ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
     built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
     configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
     libavutil      55. 78.100 / 55. 78.100
     libavcodec     57.107.100 / 57.107.100
     libavformat    57. 83.100 / 57. 83.100
     libavdevice    57. 10.100 / 57. 10.100
     libavfilter     6.107.100 /  6.107.100
     libavresample   3.  7.  0 /  3.  7.  0
     libswscale      4.  8.100 /  4.  8.100
     libswresample   2.  9.100 /  2.  9.100
     libpostproc    54.  7.100 / 54.  7.100
    Hyper fast Audio and Video encoder

    Number of frames in video can be set in #define STREAM_FRAME_RATE n//n=number of frames. Following is the entire code :

    #include
    #include <libavutil></libavutil>avassert.h>
    #include <libavutil></libavutil>channel_layout.h>
    #include <libavutil></libavutil>opt.h>
    #include <libavutil></libavutil>mathematics.h>
    #include <libavutil></libavutil>imgutils.h>
    #include <libavutil></libavutil>timestamp.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>
    #include <libswresample></libswresample>swresample.h>

    #define STREAM_DURATION   1
    #define STREAM_FRAME_RATE 2 /* 2 image/s */
    #define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */

    #define SCALE_FLAGS SWS_BICUBIC

    // a wrapper around a single output AVStream
    typedef struct OutputStream {
       AVStream *st;
       AVCodecContext *enc;

       /* pts of the next frame that will be generated */
       int64_t next_pts;
       int samples_count;

       AVFrame *frame;
       AVFrame *tmp_frame;

       float t, tincr, tincr2;

       struct SwsContext *sws_ctx;
       struct SwrContext *swr_ctx;
    } OutputStream;

    static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
    {
       AVRational *time_base = &amp;fmt_ctx->streams[pkt->stream_index]->time_base;

       printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
              av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
              av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
              av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
              pkt->stream_index);
    }

    static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
    {
       /* rescale output packet timestamp values from codec to stream timebase */
       av_packet_rescale_ts(pkt, *time_base, st->time_base);
       pkt->stream_index = st->index;
       /* Write the compressed frame to the media file. */
       log_packet(fmt_ctx, pkt);
       return av_interleaved_write_frame(fmt_ctx, pkt);
    }

    /* Add an output stream. */
    static void add_stream(OutputStream *ost, AVFormatContext *oc,
                          AVCodec **codec,
                          enum AVCodecID codec_id)
    {
       AVCodecContext *c;
       int i;
       /* find the encoder */
       *codec = avcodec_find_encoder(codec_id);
       if (!(*codec)) {
           fprintf(stderr, "Could not find encoder for '%s'\n",
                   avcodec_get_name(codec_id));
           exit(1);
       }

       ost->st = avformat_new_stream(oc, NULL);
       if (!ost->st) {
           fprintf(stderr, "Could not allocate stream\n");
           exit(1);
       }
       ost->st->id = oc->nb_streams-1;
       c = avcodec_alloc_context3(*codec);
       if (!c) {
           fprintf(stderr, "Could not alloc an encoding context\n");
           exit(1);
       }
       ost->enc = c;

       switch ((*codec)->type) {
       case AVMEDIA_TYPE_AUDIO:
       printf("######################2 audio add stream\n");
           c->sample_fmt  = (*codec)->sample_fmts ?
               (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
           c->bit_rate    = 64000;
           c->sample_rate = 44100;
           if ((*codec)->supported_samplerates) {
               c->sample_rate = (*codec)->supported_samplerates[0];
               for (i = 0; (*codec)->supported_samplerates[i]; i++) {
                   if ((*codec)->supported_samplerates[i] == 44100)
                       c->sample_rate = 44100;
               }
           }
           c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
           c->channel_layout = AV_CH_LAYOUT_STEREO;
           if ((*codec)->channel_layouts) {
               c->channel_layout = (*codec)->channel_layouts[0];
               for (i = 0; (*codec)->channel_layouts[i]; i++) {
                   if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
                       c->channel_layout = AV_CH_LAYOUT_STEREO;
               }
           }
           c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
           ost->st->time_base = (AVRational){ 1, c->sample_rate };
           break;

       case AVMEDIA_TYPE_VIDEO:
       printf("###################### video add stream\n");
           c->codec_id = codec_id;

           c->bit_rate = 400000;
           /* Resolution must be a multiple of two. */
           c->width    = 352;
           c->height   = 288;
           /* timebase: This is the fundamental unit of time (in seconds) in terms
            * of which frame timestamps are represented. For fixed-fps content,
            * timebase should be 1/framerate and timestamp increments should be
            * identical to 1. */
           ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
           c->time_base       = ost->st->time_base;

           c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
           c->pix_fmt       = STREAM_PIX_FMT;
           if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
               /* just for testing, we also add B-frames */
               c->max_b_frames = 2;//2
           }
           if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
               /* Needed to avoid using macroblocks in which some coeffs overflow.
                * This does not happen with normal video, it just happens here as
                * the motion of the chroma plane does not match the luma plane. */
               c->mb_decision = 2;//2
           }
       break;

       default:
           break;
       }

       /* Some formats want stream headers to be separate. */
       if (oc->oformat->flags &amp; AVFMT_GLOBALHEADER)
           c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    }


    /**************************************************************/
    /* video output */

    static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
    {
       AVFrame *picture;
       int ret;

       picture = av_frame_alloc();
       if (!picture)
           return NULL;

       picture->format = pix_fmt;
       picture->width  = width;
       picture->height = height;

       /* allocate the buffers for the frame data */
       ret = av_frame_get_buffer(picture, 32);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not allocate frame data.\n");
           exit(1);
       }

       return picture;
    }

    static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
    {
       int ret;
       AVCodecContext *c = ost->enc;
       AVDictionary *opt = NULL;

       av_dict_copy(&amp;opt, opt_arg, 0);
       printf("In open video\n");
       /* open the codec */
       ret = avcodec_open2(c, codec, &amp;opt);
       av_dict_free(&amp;opt);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
           exit(1);
       }

       /* allocate and init a re-usable frame */
       ost->frame = alloc_picture(c->pix_fmt, c->width, c->height);
       if (!ost->frame) {
           fprintf(stderr, "Could not allocate video frame\n");
           exit(1);
       }

       /* If the output format is not YUV420P, then a temporary YUV420P
        * picture is needed too. It is then converted to the required
        * output format. */
       ost->tmp_frame = NULL;
       if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
           ost->tmp_frame = alloc_picture(AV_PIX_FMT_YUV420P, c->width, c->height);
           if (!ost->tmp_frame) {
               fprintf(stderr, "Could not allocate temporary picture\n");
               exit(1);
           }
       }

       /* copy the stream parameters to the muxer */
       ret = avcodec_parameters_from_context(ost->st->codecpar, c);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not copy the stream parameters\n");
           exit(1);
       }
    }

    int open_image(const char* imageFileName,int width,int height,AVFrame *pict)
    {
       AVFormatContext *pFormatContext = avformat_alloc_context();
           if (!pFormatContext)
           {
               printf("ERROR could not allocate memory for Format Context");
               return 0;
           }
       //av_register_all();
       if (avformat_open_input(&amp;pFormatContext, imageFileName, NULL, NULL) != 0)
           {
           printf("ERROR could not open the file");
           return 0;
           }
       printf("format %s, duration %ld us, bit_rate %ld", pFormatContext->iformat->name, pFormatContext->duration, pFormatContext->bit_rate);
       if (avformat_find_stream_info(pFormatContext,  NULL) &lt; 0)
           {
           printf("ERROR could not get the stream info");
           return 0;
           }
       AVCodecParameters *pCodecParameters = pFormatContext->streams[0]->codecpar;
       printf("%d",pFormatContext->nb_streams);
       AVCodec *pCodec = avcodec_find_decoder(AV_CODEC_ID_MJPEG);
       if (pCodec==NULL) {
           printf("ERROR unsupported codecopenimage!");
           printf("---------------------------------------11");
           return 0;
           }
       AVCodecContext *pCodecCtx =avcodec_alloc_context3(pCodec);
       if (!pCodecCtx)
           {
               printf("failed to allocated memory for AVCodecContext");
               return 0;
           }
           pCodecCtx->width = pCodecParameters->width;
           pCodecCtx->height = pCodecParameters->height;
           pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
       if(pCodecCtx->color_range==AVCOL_RANGE_JPEG) printf("\nAVCOL_RANGE_JPEG\n");
       if (avcodec_parameters_to_context(pCodecCtx, pCodecParameters) &lt; 0)
           {
               printf("failed to copy codec params to codec context");
               return 0;
           }
       // Open codec
           if(avcodec_open2(pCodecCtx, pCodec,NULL)&lt;0)
               {
               printf("Could not open codec");
               return 0;
               }

           AVFrame *pFrame = av_frame_alloc();
           if (!pFrame)
               {
               printf("Can't allocate memory for AVFrame\n");
               return 0;
               }

           AVPacket *packet= av_packet_alloc();

           int temp=av_read_frame(pFormatContext, packet);
           while (temp >= 0)
               {
               if(packet->stream_index != 0){
                       continue;}
               int ret = avcodec_send_packet(pCodecCtx,packet);
               if (ret &lt; 0)
                   {
               printf("Error while sending a packet to the decoder: %s", av_err2str(ret));
                   return 0;
                   }
           ret = avcodec_receive_frame(pCodecCtx,pFrame);
               if (ret = 0 || ret != AVERROR(EAGAIN) || ret != AVERROR_EOF)
                   {
                       pFrame->quality = 1;
                   av_packet_unref(packet);
                   struct SwsContext *resize;
                   resize = sws_getContext(pCodecParameters->width, pCodecParameters->height,
                                             AV_PIX_FMT_YUVJ420P,
                                             width, height,
                                             AV_PIX_FMT_YUV420P,
                                             SCALE_FLAGS, NULL, NULL, NULL);
                   sws_scale(resize,(const uint8_t * const *)pFrame->data, pFrame->linesize,
                     0, pCodecParameters->height, pict->data, pict->linesize);
               av_packet_free(&amp;packet);
               avcodec_free_context(&amp;pCodecCtx);
               avformat_close_input(&amp;pFormatContext);
                       return 1;
                   }
               else {
                       printf("Error [%d] while decoding frame: %s\n", ret,
               strerror(AVERROR(ret)));
               return 0;
                   }
               }
       avcodec_free_context(&amp;pCodecCtx);
       avformat_close_input(&amp;pFormatContext);
       return 0;
       }

    static void fill_yuv_image(AVFrame *pict, int frame_index,
                              int width, int height)
    {
       int ret;
       /* when we pass a frame to the encoder, it may keep a reference to it
        * internally;
        * make sure we do not overwrite it here*/

       ret = av_frame_make_writable(pict);
       if (ret &lt; 0)
           exit(1);

       char filename[256];
       sprintf(filename, "sample%d.jpg", frame_index+1);

       if(open_image(filename,width,height,pict)!=1) exit(1);
    }

    static AVFrame *get_video_frame(OutputStream *ost)
    {
       AVCodecContext *c = ost->enc;
       /* check if we want to generate more frames */
       if (av_compare_ts(ost->next_pts, c->time_base,
                         STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
           return NULL;

       if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
           /* as we only generate a YUV420P picture, we must convert it
            * to the codec pixel format if needed */
           if (!ost->sws_ctx) {
               ost->sws_ctx = sws_getContext(c->width, c->height,
                                             AV_PIX_FMT_YUV420P,
                                             c->width, c->height,
                                             c->pix_fmt,
                                             SCALE_FLAGS, NULL, NULL, NULL);
               if (!ost->sws_ctx) {
                   fprintf(stderr,
                           "Could not initialize the conversion context\n");
                   exit(1);
               }
           }
           fill_yuv_image(ost->tmp_frame, ost->next_pts, c->width, c->height);
           sws_scale(ost->sws_ctx,
                     (const uint8_t * const *)ost->tmp_frame->data, ost->tmp_frame->linesize,
                     0, c->height, ost->frame->data, ost->frame->linesize);
       } else {
           fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
       }

       ost->frame->pts = ost->next_pts++;

       return ost->frame;
    }

    /*
    * encode one video frame and send it to the muxer
    * return 1 when encoding is finished, 0 otherwise
    */
    static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
    {
       int ret;
       AVCodecContext *c;
       AVFrame *frame;
       int got_packet = 0;
       AVPacket pkt = { 0 };

       c = ost->enc;
       printf("In write_video_frame\n");
       frame = get_video_frame(ost);

       av_init_packet(&amp;pkt);

       /* encode the image */
       ret = avcodec_encode_video2(c, &amp;pkt, frame, &amp;got_packet);
       if (ret &lt; 0) {
           fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
           exit(1);
       }
       if (got_packet) {
           ret = write_frame(oc, &amp;c->time_base, ost->st, &amp;pkt);
       } else {
           ret = 0;
       }
       if (ret &lt; 0) {
           fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
           exit(1);
       }

       return (frame || got_packet) ? 0 : 1;
    }

    static void close_stream(AVFormatContext *oc, OutputStream *ost)
    {
       avcodec_free_context(&amp;ost->enc);
       av_frame_free(&amp;ost->frame);
       av_frame_free(&amp;ost->tmp_frame);
       sws_freeContext(ost->sws_ctx);
       swr_free(&amp;ost->swr_ctx);
    }

    /**************************************************************/
    /* media file output */

    int main(int argc, char **argv)
    {
       OutputStream video_st = { 0 };
       const char *filename;
       AVOutputFormat *fmt;
       AVFormatContext *oc;
       AVCodec *video_codec;
       int ret;
       int have_video = 0;
       int encode_video = 0;
       AVDictionary *opt = NULL;
       int i;

       /* Initialize libavcodec, and register all codecs and formats. */
       av_register_all();

       if (argc &lt; 2) {
           printf("usage: %s output_file\n"
                  "API example program to output a media file with libavformat.\n"
                  "This program generates a synthetic audio and video stream, encodes and\n"
                  "muxes them into a file named output_file.\n"
                  "The output format is automatically guessed according to the file extension.\n"
                  "Raw images can also be output by using '%%d' in the filename.\n"
                  "\n", argv[0]);
           return 1;
       }

       filename = argv[1];
       for (i = 2; i+1 &lt; argc; i+=2) {
           if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
               av_dict_set(&amp;opt, argv[i]+1, argv[i+1], 0);
       }

       /* allocate the output media context */
       avformat_alloc_output_context2(&amp;oc, NULL, NULL, filename);
       if (!oc) {
           printf("Could not deduce output format from file extension: using MPEG.\n");
           avformat_alloc_output_context2(&amp;oc, NULL, "mpeg", filename);
       }
       if (!oc)
           return 1;

       fmt = oc->oformat;

       /* Add the audio and video streams using the default format codecs
        * and initialize the codecs. */
       if (fmt->video_codec != AV_CODEC_ID_NONE) {
           add_stream(&amp;video_st, oc, &amp;video_codec, fmt->video_codec);
           have_video = 1;
           encode_video = 1;
       }

       /* Now that all the parameters are set, we can open the audio and
        * video codecs and allocate the necessary encode buffers. */
       if (have_video)
           open_video(oc, video_codec, &amp;video_st, opt);

       av_dump_format(oc, 0, filename, 1);

       /* open the output file, if needed */
       if (!(fmt->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;oc->pb, filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not open '%s': %s\n", filename,
                       av_err2str(ret));
               return 1;
           }
       }

       /* Write the stream header, if any. */
       ret = avformat_write_header(oc, &amp;opt);
       if (ret &lt; 0) {
           fprintf(stderr, "Error occurred when opening output file: %s\n",
                   av_err2str(ret));
           return 1;
       }
       while (encode_video) {
           /* select the stream to encode */
       printf("######################\n");
           if (encode_video &amp;&amp;
               (av_compare_ts(video_st.next_pts, video_st.enc->time_base,STREAM_DURATION, (AVRational){ 1, 1 }) &lt;= 0)) {
               encode_video = !write_video_frame(oc, &amp;video_st);
           }
       }

       av_write_trailer(oc);

       /* Close each codec. */
       if (have_video)
           close_stream(oc, &amp;video_st);

       if (!(fmt->flags &amp; AVFMT_NOFILE))
           /* Close the output file. */
           avio_closep(&amp;oc->pb);

       /* free the stream */
       avformat_free_context(oc);

       return 0;
    }```