Recherche avancée

Médias (91)

Autres articles (37)

  • Use, discuss, criticize

    13 avril 2011, par

    Talk to people directly involved in MediaSPIP’s development, or to people around you who could use MediaSPIP to share, enhance or develop their creative projects.
    The bigger the community, the more MediaSPIP’s potential will be explored and the faster the software will evolve.
    A discussion list is available for all exchanges between users.

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • De l’upload à la vidéo finale [version standalone]

    31 janvier 2010, par

    Le chemin d’un document audio ou vidéo dans SPIPMotion est divisé en trois étapes distinctes.
    Upload et récupération d’informations de la vidéo source
    Dans un premier temps, il est nécessaire de créer un article SPIP et de lui joindre le document vidéo "source".
    Au moment où ce document est joint à l’article, deux actions supplémentaires au comportement normal sont exécutées : La récupération des informations techniques des flux audio et video du fichier ; La génération d’une vignette : extraction d’une (...)

Sur d’autres sites (6228)

  • How to adjust mpeg 2 ts start time with ffmpeg ?

    24 juillet 2019, par Maxim Kornienko

    I’m writing simple HLS (Http Live Streaming) java server to live cast (really live, not on demand) screenshow + voice. I constantly get chunks of image frames and audio samples as input to my service and produce mpeg 2 ts files + m3u8 playlist web page as output. The workflow is the following :

    1. Collect (buffer) source video frames and audio for certain period of time
    2. Convert series of video frames to h.264 encoded video file
    3. Convert audio samples to mp3 audio file
    4. Merge them to .ts file with ffmpeg command

      ffmpeg -i audio.mp3 -i video.mp4 -f mpegts -c:a copy -c:v copy -vprofile main -level:v 4.0 -vbsf h264_mp4toannexb -flags -global_header segment.ts
    5. Publish several .ts files on m3u8 playlist.

    The problem is resulting playlist interrupts after first segment is played. VLC logs following error :

    freetype error: Breaking unbreakable line
    ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096
    core error: ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)
    core error: ES_OUT_RESET_PCR called
    core error: Could not convert timestamp 185529572000
    ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096
    core error: ES_OUT_SET_(GROUP_)PCR is called too late (jitter of 8653 ms ignored)
    core error: Could not get display date for timestamp 0
    core error: Could not convert timestamp 185538017000
    core error: Could not convert timestamp 185538267000
    core error: Could not convert timestamp 185539295977
    ...

    I guess the reason is that start time of segments do not belong to one stream, but it’s impossible to concat and resegment (with ffmepg -f segment) whole stream once new chunk is added. Tried adding #EXT-X-DISCONTINUITY tag to playlist as suggested here but it didn’t help. When I ffprobe them I get :

    Input #0, mpegts, from '26.ts':
    Duration: 00:00:10.02, start: 1.876978, bitrate: 105 kb/s
    Program 1
    Metadata:
     service_name    : Service01
     service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 640x640, 4 fps, 4 tbr, 90k tbn, 8 tbc
    Stream #0:1[0x101]: Audio: mp3 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s  

    Where start value in line Duration: 00:00:10.02, start: 1.876978, bitrate: 105 kb/s is more or less equal for all segments.
    When I check segments from available proven-to-work playlists (like http://vevoplaylist-live.hls.adaptive.level3.net/vevo/ch1/appleman.m3u8) they all have diffrenet start values for each segment, for example :

    Input #0, mpegts, from 'segm150518140104572-424570.ts':
    Duration: 00:00:06.17, start: 65884.808689, bitrate: 479 kb/s
    Program 257
    Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 115 kb/s
    Stream #0:2[0x22]: Data: timed_id3 (ID3  / 0x20334449)

    and the next after it

    Input #0, mpegts, from 'segm150518140104572-424571.ts':
    Duration: 00:00:06.22, start: 65890.814689, bitrate: 468 kb/s
    Program 257
    Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 124 kb/s
    Stream #0:2[0x22]: Data: timed_id3 (ID3  / 0x20334449)

    differ in the way that start time of segm150518140104572-424571.ts is equal to start time + duration of segm150518140104572-424570.ts.

    How could this start value be adjusted with ffmpeg ? Or maybe my whole aproach is wrong ? Unfortunately I couldn’t find on the internet working example of live (not on demand) video service implemented with ffmepg.

  • How can I stream mjpeg file as rtsp

    24 août 2013, par Ilya Yevlampiev

    We have an mjpeg video, obtained from the webcam and stored into *.avi file, still encoded as mjpeg.

    We need to restream this file as rtsp (and stil preserve the mjpeg there, i.e. no decoding). The goal is to emulate the webcam this video was obtained from for the software that processes the video. The file can be open with vlc/ffplay with no problems. The ffmpeg behaves like it is streaming it, however, ffplay/vlc can't open this stream.

    We tried to stream if with gstreamer.

    1) we fount no free rtsp sink element for gstreamer pipeline. So, is there a free analogue for rtspsink to launch this pipeline with gst-launch ? we need and only cast, so we don't need so advanced element as rtspsink is.

    2) we also tried to build own simple rtsp server as described in http://weeklybuild.com/2013/01/creating-an-rtsp-stream-with-gstreamer/

    replacing videotestsrc with filesrc ; but what kind of elements we should use there ? usage of an only filesrc doesn't help ; we get the same problem as if we stream with ffmpeg. But what kind of lements we need there, if we dont' wan to decode/encode it, just to stream the file (to reproduce the thing what the webcam actually does).

    $ ffplay rtsp://127.0.0.1:8554/test -loglevel debug
    avplay version 0.8.5-6:0.8.5-1, Copyright (c) 2003-2012 the Libav developers
    built on Jan 13 2013 12:05:48 with gcc 4.7.2
    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.5-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avutil      configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avcodec     configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avformat    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    swscale     configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    postproc    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-            postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    libavutil    51. 22. 1 / 51. 22. 1
    libavcodec   53. 35. 0 / 53. 35. 0
    libavformat  53. 21. 1 / 53. 21. 0
    libavdevice  53.  2. 0 / 53.  2. 0
    libavfilter   2. 15. 0 /  2. 15. 0
    libswscale    2.  1. 0 /  2.  1. 0
    libpostproc  52.  0. 0 / 52.  0. 0
    [rtsp @ 0x7f558c0008c0] method DESCRIBE failed: 503 Service Unavailable
    [rtsp @ 0x7f558c0008c0] CSeq: 2
    Server: GStreamer RTSP server
    Date: Thu, 22 Aug 2013 07:49:30 GMT

    rtsp://127.0.0.1:8554/test: Invalid data found when processing input

    And everything is okay when I try gstreamer server built as in example, i.e. using videotestsrc

  • Why does my discord bot not able to find the file that is there when I open the folder manually ?

    22 juin 2021, par Toma

    I made a discord bot that should play music using ffmpeg.

    


    It's connecting and downloading the youtube webm file after which it should convert and rename it to song.mp3 but it doesn't manage to do so. I check the folder and the error message doesn't match what I see - the file is there and has been renamed.

    


      

    1. Am I using the replace command correctly to move the file ?
    2. 


    3. I'd note that I'm using windows10 and that the folders are all read only and that although I'm the admin I can't change that no matter what I do (I guess it's a win10 bug). Does that have anything to do with it ?
    4. 


    5. Is there another mistake in the code that'd prevent the file from being found by the bot ?
    6. 


    


    My code :

    


    import discord
from discord.ext import commands
import youtube_dl #for url music command
import os

client = commands.Bot(command_prefix = '><')

#connect to voice channel
@client.command(aliases = ['c'])
async def connect(ctx, vcName):
    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
    voiceChannel = discord.utils.get(ctx.guild.channels, name=str(vcName))
    if voice == None: #if voice is not connected to any channel
        await voiceChannel.connect()
    else:
        if voice.channel == vcName: #if trying to connect to the same channel
            await ctx.send('already connected to this channel')
        else:
            await voice.move_to(vcName)

@client.command(aliases = ['d'])
async def delFile(ctx):
    song_there = os.path.exists(os.getcwd()+'/music/current/song.mp3') #true when song.mp3 exists in 'current' folder in 'music' folder
    if song_there:
        await ctx.send('song was detected')
        os.remove('song.mp3')
        if song_there:
            await ctx.send('song was not deleted')
    else:
        await ctx.send('File is not found. check the name again')

#play music from url

@client.command(aliases = ['p'])
async def playMusic(ctx, vcName, url : str): #play music file
    song_there = os.path.exists(os.path.join(os.getcwd(),'/music/current/song.mp3'))
    try:
        if song_there:
            print('previous song found')
            os.remove(os.path.join(os.getcwd(),'/music/current/song.mp3')) #removes the song in current to make room for a new song
            if song_there:
                print('song was not deleted')
            else:
                print('song deleted')
    except PermissionError:
        await ctx.send('A song is currently playing')
        return
    voiceChannel = discord.utils.get(ctx.guild.channels, name=str(vcName))
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }]
    }


   for file in os.listdir('./'):
        if file.endswith('.mp3'):       #if song.mp3 already exists delete it to make room for a new download
            os.remove('song.mp3')
        else:                           #download the file from youtube
            with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                ydl.download([url])
    for file in os.listdir('./'):       #after downloading rename the file and move it to current folder
        if not file == ('song.mp3') and file.endswith('.mp3'):
            os.rename(file, 'song.mp3')
            print(os.path.join(os.getcwd(), 'song.mp3'))
            print(os.path.join(os.getcwd(), '/music/current/song.mp3'))
            os.replace(os.path.join(os.getcwd(), 'song.mp3'), os.path.join(os.getcwd(), '/music/current/song.mp3'))   #move file to current

    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
    if not voice is None:               #if voice is already created
        if not voice.is_connected():    #and is not connected
            await voiceChannel.connect()
        voice.play(discord.FFmpegPCMAudio('song.mp3'))
    else:
        await ctx.send('Bot made an oopsy. Cast mending and heal bot.')
client.run('token')


    


    Error :

    


    [youtube] wkJ7oDMqz0A: Downloading webpage
[download] The Minor Bee-wkJ7oDMqz0A.webm has already been downloaded
[download] 100% of 5.13MiB
[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3
Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)
[youtube] wkJ7oDMqz0A: Downloading webpage
[download] Destination: The Minor Bee-wkJ7oDMqz0A.webm
[download] 100% of 5.13MiB in 00:00                   
[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3
Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)
[youtube] wkJ7oDMqz0A: Downloading webpage
[download] Destination: The Minor Bee-wkJ7oDMqz0A.webm
[download] 100% of 5.13MiB in 00:00                  
[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3
Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)
C:.....song.mp3 -> **C:/music/current/song.mp3**
Ignoring exception in command playMusic:
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:...tut-bot.py", line 84, in playMusic
    os.replace(os.path.join(os.getcwd(), 'song.mp3'), os.path.join(os.getcwd(), '/music/current/song.mp3'))   #move file to current
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\....\\song.mp3' -> 'C:/music/current/song.mp3'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\\...\\song.mp3' -> 'C:/music/current/song.mp3'