Recherche avancée

Médias (39)

Mot : - Tags -/audio

Autres articles (33)

  • La file d’attente de SPIPmotion

    28 novembre 2010, par

    Une file d’attente stockée dans la base de donnée
    Lors de son installation, SPIPmotion crée une nouvelle table dans la base de donnée intitulée spip_spipmotion_attentes.
    Cette nouvelle table est constituée des champs suivants : id_spipmotion_attente, l’identifiant numérique unique de la tâche à traiter ; id_document, l’identifiant numérique du document original à encoder ; id_objet l’identifiant unique de l’objet auquel le document encodé devra être attaché automatiquement ; objet, le type d’objet auquel (...)

  • D’autres logiciels intéressants

    12 avril 2011, par

    On ne revendique pas d’être les seuls à faire ce que l’on fait ... et on ne revendique surtout pas d’être les meilleurs non plus ... Ce que l’on fait, on essaie juste de le faire bien, et de mieux en mieux...
    La liste suivante correspond à des logiciels qui tendent peu ou prou à faire comme MediaSPIP ou que MediaSPIP tente peu ou prou à faire pareil, peu importe ...
    On ne les connais pas, on ne les a pas essayé, mais vous pouvez peut être y jeter un coup d’oeil.
    Videopress
    Site Internet : (...)

  • Des sites réalisés avec MediaSPIP

    2 mai 2011, par

    Cette page présente quelques-uns des sites fonctionnant sous MediaSPIP.
    Vous pouvez bien entendu ajouter le votre grâce au formulaire en bas de page.

Sur d’autres sites (6171)

  • How do i properly setup ffmpeg and fix this "Permission Denied" error im getting ?

    8 décembre 2020, par ExaNori

    Error im getting
C:/Users/Motzumoto/Desktop/AGB/ffmpeg/bin: Permission denied

    


    I already have ffmpeg installed to path on my windows 10 machine, but that didnt fix it, so i just tried to put ffmpeg in my bots directory, that didnt do it either.
Heres my music code if anyone can help
It uses a mixture of youtube-dl and ffmpeg
If there are also any errors that would stop this from working at all it'd be nice if you could show me them, im quite tired of this as of now and im honestly just about to scrap this idea and forget about it

    


    I've tried linking the path to the ffmpeg.exe, that still didnt work, i got the same error, i have no idea what to do

    


    import asyncio
import logging
import math
from urllib import request

import discord
from discord.ext import commands
import youtube_dl
from utils.guilds import Guilds
import ffmpeg
from asyncio import run_coroutine_threadsafe as coroutine

DOWNLOAD_PATH = "audio" # download path of the file
STREAM_INDICATOR_PREFIX = "${STREAM}:"




# options
ytdl_options = {
    "quiet": True,
    "forceipv4": True,
    "noplaylist": True,
    "no_warnings": True,
    "ignoreerrors": True,
    "nooverwrites": True,
    "restrictfilenames": True,
    "nocheckcertificate": True,
    "default_search": "auto",
    "format": "bestaudio/best",
}
ffmpeg_options = {
    "options": "-vn" # indicates that we have disabled video recording in the output file
}

ytdl = youtube_dl.YoutubeDL(ytdl_options) # youtube_dl object

# checks functions
def is_connected(ctx):
    """Check if the bot is connected to a voice channel."""
    
    if ctx.voice_client:
        return True
    
    return False
def is_same_channel(ctx):
    """Check if the bot and the user is in the same channel."""
    
    # try to get their voice channel id if there's any
    try:
        bot_channel_id = ctx.voice_client.channel.id
        user_channel_id = ctx.author.voice.channel.id
    # if one of them is not connected to a voice channel then they're not together
    except AttributeError:
        return False
    
    # check if their voice channel id is the same
    if bot_channel_id == user_channel_id:
        return True
    
    return False
async def checks(ctx):
    """Do some checking."""
    
    # check if the user and the bot is in the same channel
    if not is_same_channel(ctx):
        await ctx.send("I am not with you. How dare you to command me like that.")
        return False
    
    return True

# other function
async def create_source(ctx, query):
    """Creates youtube_dl audio source for discord.py voice client."""
    
    try:
        async with ctx.typing(): # shows that the bot is typing in chat while searching for an audio source
            source = await YTDLSource.from_url(query, ctx.bot.loop) # creates a youtube_dl source
    except IndexError: # if found nothing
        await ctx.send("I found nothing with the given query..")
        return None
    
    return source

class Music(commands.Cog, name="music"):
    def __init__(self, bot):
        self.bot = bot
        self.guilds = Guilds() # collection of some guilds that this bot is currently in
    
    async def cog_command_error(self, ctx, error):
        """Catch all errors of this cog."""
        
        # a check on a command has failed
        if isinstance(error, commands.CheckFailure):
            await ctx.send("I'm not connected to any voice channel.")
        # ignore this error because it is already handled at the command itself
        elif isinstance(error, commands.errors.BadArgument):
            pass
        # otherwise, log all the other errors
        else:
            music_logger.exception(error)
            await ctx.send(error)
    
    @commands.command()
    async def join(self, ctx):
        """Invite me to your voice channel."""
        
        try:
            async with ctx.typing(): # shows that the bot is typing in chat while joining the voice channel
                await ctx.author.voice.channel.connect()
                await ctx.send("Alright, I joined your voice channel.")
        # user is not yet connected to a voice channel
        except AttributeError:
            await ctx.send(f"You must be connected to a voice channel first {ctx.author.name}.")
        # bot is already connected to a voice channel
        except discord.ClientException:
            if is_same_channel(ctx):
                await ctx.send("I'm already with you.")
            else:
                await ctx.send("I'm already with somebody else.")
    
    @commands.command()
    @commands.check(is_connected)
    async def leave(self, ctx):
        """Kick me out of your voice channel."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        # reset some bot's states
        self.guilds(ctx).has_played_voice = False # reset 'has_played_voice' state
        self.guilds(ctx).queue.clear() # reset the queue
        
        # finally, stop and disconnect the bot
        ctx.voice_client.stop() # stop the bot's voice
        await ctx.voice_client.disconnect() # disconnect the bot from voice channel
        await ctx.send("Ah, alright, cya.")
    
    async def play_source(self, ctx, vc, source):
        """Play an audio to a voice channel."""
        
        def play_next(error):
            """Executes when the voice client is done playing."""
            
            # log the errors if there is any
            if error:
                music_logger.exception(error)
                coroutine(ctx.send(error), self.bot.loop)
            
            # ensure that there is a song in queue
            if self.guilds(ctx).queue.queue:
                coroutine(ctx.invoke(self.bot.get_command("next")), self.bot.loop) # go to the next song
        
        vc.play(source, after=play_next) # play the voice to the voice channel
        await ctx.send(f"Now playing '{source.title}'.")
    
    @commands.command(aliases=("p", "stream"))
    async def play(self, ctx, *, query=""):
        """Play a song for you."""
        
        # check if the query argument is empty
        if not query:
            # if yes, cancel this command
            await ctx.send("What should I play?")
            return
        
        # check if this command is invoked using 'stream' alias
        if ctx.invoked_with == "stream":
            SIP = STREAM_INDICATOR_PREFIX # put prefix to the title of the source that indicates that it must be streamed
        else:
            SIP = ""
        
        # ensure that the bot is connected a voice channel
        try:
            # connect the bot to the user voice channel
            await ctx.author.voice.channel.connect()
        except AttributeError:
            # user is not yet connected to a voice channel
            await ctx.send(f"You must be connected to a voice channel first {ctx.author.name}.")
            return
        except discord.ClientException:
            pass # just ignore if bot is already connected to the voice channel
        
        # do some other checking before executing this command
        if not await checks(ctx):
            return
        
        # create the audio source
        source = await create_source(ctx, SIP + query)
        
        # ensure that there is actually a source
        if source:
            # initialize bot's states if the the queue is still empty
            if not self.guilds(ctx).queue.queue:
                self.guilds(ctx).has_played_voice = True # this means that the bot has played in the voice at least once
                self.guilds(ctx).queue.enqueue(SIP + source.title)
            
            # play the audio
            try:
                await self.play_source(ctx, ctx.voice_client, source)
            # enqueue the source if audio is already playing
            except discord.ClientException:
                self.guilds(ctx).queue.enqueue(SIP + source.title)
                await ctx.send(f"'{source.title}' is added to the queue.")
    
    @commands.command()
    @commands.check(is_connected)
    async def volume(self, ctx, *, vol=None):
        """Adjust my voice volume."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        vc = ctx.voice_client # get the voice client
        
        # ensure that the bot is playing voice in order to change the volume
        if not self.guilds(ctx).has_played_voice:
            await ctx.send("I haven't even started yet.")
            return
        elif vc.source is None:
            await ctx.send("I am not playing anything.")
            return
        
        # check if user has passed an argument
        if vol is None:
            await ctx.send("I expect an argument from 0 to 100.")
            return
        
        # cast string argument 'vol' into a float
        try:
            vol = float(vol)
        # except if the argument is not a number
        except ValueError:
            await ctx.send("The argument must only be a number.")
            return
        
        # set the volume
        if vol >= 0 and vol <= 100: # bound the volume from 0 to 100
            vc.source.volume = vol / 100
        else:
            await ctx.send("I expect a value from 0 to 100.")
    
    @commands.command()
    @commands.check(is_connected)
    async def pause(self, ctx):
        """Pause the song."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        vc = ctx.voice_client # get the voice client
        
        # ensure that the bot's voice is playing in order to pause
        if vc.is_playing():
            vc.pause()
            await ctx.send("Alright, paused.")
        # the bot haven't played yet
        elif not self.guilds(ctx).has_played_voice:
            await ctx.send("I haven't even started yet.")
        # there is no song in queue
        elif not self.guilds(ctx).queue.queue:
            await ctx.send("I am not playing anything.")
        else:
            await ctx.send("I already paused.")
    
    @commands.command()
    @commands.check(is_connected)
    async def resume(self, ctx):
        """Resume the song."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        vc = ctx.voice_client # get the voice client
        
        # ensure that the bot's voice is paused in order to resume
        if vc.is_paused():
            vc.resume()
            await ctx.send("Alright, song resumed")
        # the bot haven't played yet
        elif not self.guilds(ctx).has_played_voice:
            await ctx.send("I haven't even started yet.")
        # there is no song in queue
        elif not self.guilds(ctx).queue.queue:
            await ctx.send("I am not playing anything.")
        else:
            await ctx.send("I am not paused.")
    
    async def update_song(self, ctx):
        """Change the currently playing song."""
        
        vc = ctx.voice_client # get the voice client
        current = self.guilds(ctx).queue.current # get the current song in queue if there's any
        
        # ensure that the queue is not empty
        if current:
            source = await create_source(ctx, current) # create the audio source
        # the bot haven't played yet
        elif not self.guilds(ctx).has_played_voice:
            await ctx.send("I haven't even started yet.")
            return
        else:
            vc.stop() # stop the voice just to be sure
            await ctx.send("No more songs unfortunately.")
            return
        
        # if voice client is already playing, just change the source
        if vc.is_playing():
            vc.source = source
            await ctx.send(f"Now playing '{source.title}'.")
        # otherwise, play the source
        else:
            await self.play_source(ctx, vc, source)
    
    @commands.command()
    @commands.check(is_connected)
    async def next(self, ctx):
        """Skip the current song."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        self.guilds(ctx).queue.shift(1) # shift the queue to the left
        await self.update_song(ctx) # change the current song
    
    @commands.command()
    @commands.check(is_connected)
    async def prev(self, ctx):
        """Go back to the previous song."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        self.guilds(ctx).queue.shift(-1) # shift the queue to the right
        await self.update_song(ctx) # change the current song
    
    @commands.command()
    @commands.check(is_connected)
    async def removesong(self, ctx, *, index=1):
        """Remove a song in the queue."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        index -= 1 # decrement the 'index' to match the zero-based index of Python
        
        # if index is equal to 0, that means remove the currently playing song
        # do some extra stuff before removing the current song
        if index == 0:
            # try to remove a song in queue
            try:
                self.guilds(ctx).queue.dequeue() # dequeue a song in the queue
                self.guilds(ctx).queue.shift(-1) # shift the queue to the right so that the next song will be played instead of the next next song
                await ctx.invoke(self.bot.get_command("next")) # finally, play the next song
            # except when the queue is empty
            except IndexError:
                await ctx.send("I haven't even started yet.")
        # otherwise, just remove a song in queue
        else:
            # try to remove the song in queue
            try:
                self.guilds(ctx).queue.pop(index)
                await ctx.send("Song removed")
            # except if the song is not in the queue
            except IndexError:
                # check if the bot has not started playing yet
                if not self.guilds(ctx).has_played_voice:
                    await ctx.send("I haven't even started yet...")
                else:
                    await ctx.send(f"I can't remove that {ctx.author.name} because it doesn't exist.")
    @removesong.error
    async def remove_error(self, ctx, error):
        """Error handler for the 'remove' command."""
        
        # check if the argument is bad
        if isinstance(error, commands.errors.BadArgument):
            await ctx.send(f"I can't remove that {ctx.author.name}.")
            await ctx.send("The argument must only be a number or leave it none.")
    
    @commands.command()
    @commands.check(is_connected)
    async def stop(self, ctx):
        """Stop all the songs."""
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        vc = ctx.voice_client # get the voice client
        
        # ensure that the bot is connected to the voice client
        if vc.is_playing() or vc.is_paused():
            self.guilds(ctx).queue.clear() # reset the queue
            ctx.voice_client.stop() # stop the bot's voice
            await ctx.send("Playback stopped")
        # the bot haven't played yet
        elif not self.guilds(ctx).has_played_voice:
            await ctx.send("I haven't even started yet.")
        else:
            await ctx.send("I already stopped.")
    
    @commands.command()
    @commands.check(is_connected)
    async def queue(self, ctx):
        """Show the queue of songs."""
        
        SIP = STREAM_INDICATOR_PREFIX # shorten the variable name
        
        # do some checking before executing this command
        if not await checks(ctx):
            return
        
        # try to send the songs in the queue
        try:
            # format the queue to make it readable
            queue = [
                f"{i}." + (" (STREAM) " if q.startswith(SIP) else " ") + q.split(SIP)[-1]
                for i, q in enumerate(self.guilds(ctx).queue.queue, 1)
            ]
            
            await ctx.send("\n".join(queue))
        # except if it is empty
        except HTTPException:
            await ctx.send("No songs in queue.")

class YTDLSource(discord.PCMVolumeTransformer):
    """Creates a youtube_dl audio source with volume control."""
    
    def __init__(self, source, *, data, volume=1):
        super().__init__(source, volume)
        self.data = data
        self.title = data.get("title")
        self.url = data.get("url")
    
    @classmethod
    async def from_url(cls, url, loop):
        """Get source by URL."""
        
        # check if the URL is must be streamed
        if url.startswith(STREAM_INDICATOR_PREFIX):
            stream = True
        else:
            stream = False
        
        # get data from the given URL
        data = await loop.run_in_executor(
            None,
            (lambda:
                ytdl.extract_info(
                    url.split(STREAM_INDICATOR_PREFIX)[-1], # remove the prefix from the URL
                    download=not stream
                ))
        )
        ##$$$$ fix error somtimes
        # take the first item from the entries if there's any
        if "entries" in data:
            try:
                data = data["entries"][0]
            except Exception as e:
                music_logger.exception(e)
                return None
        
        filepath = data["url"] if stream else ytdl.prepare_filename(data) # source url or download path of the file, depends on the 'stream' parameter
        return cls(discord.FFmpegPCMAudio("C:/Users/Motzumoto/Desktop/AGB/ffmpeg/bin", **ffmpeg_options), data=data) # create and return the source

def setup(bot):
    bot.add_cog(Music(bot))



    


  • FFMPEG-PHP Error "Sample rate index in program config element does not match the sample rate index configured by the container."

    21 novembre 2020, par Jonathan

    Am using FFMPEG installed on a Windows server. I have a PHP webpage that uploads and trims videos using FFMPEG, when I upload MP4's with AAC audio, especially videos over 100mb, I get the following errors in the log output below.

    


    I was wondering if anyone could point me in the right direction to getting this resolved.

    


    Log output of the error below :

    


    <pre>object(FFMpeg\Exception\RuntimeException)#35 (7) {&#xA;  ["message":protected]=>&#xA;  string(15) "Encoding failed"&#xA;  ["string":"Exception":private]=>&#xA;  string(0) ""&#xA;  ["code":protected]=>&#xA;  int(0)&#xA;  ["file":protected]=>&#xA;  string(108) "C:\inetpub\wwwroot\dev\ffmpeg-lib\ffmpeg-php\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Media\AbstractVideo.php"&#xA;  ["line":protected]=>&#xA;  int(106)&#xA;  ["trace":"Exception":private]=>&#xA;  array(1) {&#xA;    [0]=>&#xA;    array(5) {&#xA;      ["file"]=>&#xA;      string(45) "C:\inetpub\wwwroot\dev\ffmpeg-lib\process.php"&#xA;      ["line"]=>&#xA;      int(35)&#xA;      ["function"]=>&#xA;      string(4) "save"&#xA;      ["class"]=>&#xA;      string(26) "FFMpeg\Media\AbstractVideo"&#xA;      ["type"]=>&#xA;      string(2) "->"&#xA;    }&#xA;  }&#xA;  ["previous":"Exception":private]=>&#xA;  object(Alchemy\BinaryDriver\Exception\ExecutionFailureException)#43 (9) {&#xA;    ["command":protected]=>&#xA;    string(393) "C:\ffmpeg\bin\ffmpeg.exe -y -ss 00:00:17.00 -i "temp/temp_20201110-100656_1080p-220mb.mp4" -t 00:00:52.00 -threads 12 -vcodec libx264 -acodec aac -b:v 1000k -refs 6 -coder 1 -sc_threshold 40 -flags &#x2B;loop -me_range 16 -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k -pass 1 -passlogfile "W:/TempIIS\ffmpeg-passes5fabd8bdf3612uvd6b/pass-5fabd8bdf378b" "temp/20201111-122741.mp4""&#xA;    ["errorOutput":protected]=>&#xA;    string(830102) "ffmpeg version git-2020-08-31-4a11a6f Copyright (c) 2000-2020 the FFmpeg developers&#xA;  built with gcc 10.2.1 (GCC) 20200805&#xA;  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf&#xA;  libavutil      56. 58.100 / 56. 58.100&#xA;  libavcodec     58.101.101 / 58.101.101&#xA;  libavformat    58. 51.101 / 58. 51.101&#xA;  libavdevice    58. 11.101 / 58. 11.101&#xA;  libavfilter     7. 87.100 /  7. 87.100&#xA;  libswscale      5.  8.100 /  5.  8.100&#xA;  libswresample   3.  8.100 /  3.  8.100&#xA;  libpostproc    55.  8.100 / 55.  8.100&#xA;Input #0, mov,mp4,m4a,3gp,3g2,mj2, from &#x27;temp/temp_20201110-100656_1080p-220mb.mp4&#x27;:&#xA;  Metadata:&#xA;    major_brand     : mp42&#xA;    minor_version   : 19529854&#xA;    compatible_brands: mp42isom&#xA;    creation_time   : 2016-04-11T06:32:53.000000Z&#xA;  Duration: 00:02:25.98, start: 0.000000, bitrate: 13772 kb/s&#xA;    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)&#xA;    Metadata:&#xA;      creation_time   : 2016-04-11T06:32:53.000000Z&#xA;      handler_name    : Sound Media Handler&#xA;    Stream #0:1(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 13639 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)&#xA;    Metadata:&#xA;      creation_time   : 2016-04-11T06:32:53.000000Z&#xA;      handler_name    : Video Media Handler&#xA;      encoder         : AVC Coding&#xA;Stream mapping:&#xA;  Stream #0:1 -> #0:0 (h264 (native) -> h264 (libx264))&#xA;  Stream #0:0 -> #0:1 (aac (native) -> aac (native))&#xA;Press [q] to stop, [?] for help&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[h264 @ 000001fc5a3dac80] Invalid NAL unit size (-360624822 > 108076).&#xA;[h264 @ 000001fc5a3dac80] Error splitting the input into NAL units.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[aac @ 000001fc5a9ce8c0] channel element 2.15 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[h264 @ 000001fc5a3be480] Invalid NAL unit size (1926587749 > 39711).&#xA;[h264 @ 000001fc5a3be480] Error splitting the input into NAL units.&#xA;[h264 @ 000001fc5a3e4540] Invalid NAL unit size (-1483385910 > 21666).&#xA;[h264 @ 000001fc5a3e4540] Error splitting the input into NAL units.&#xA;[h264 @ 000001fc5ad06500] Invalid NAL unit size (1060193647 > 41388).&#xA;[h264 @ 000001fc5ad06500] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5ad22e80] Invalid NAL unit size (1499431567 > 26513).&#xA;[h264 @ 000001fc5ad22e80] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5a3dac80] Invalid NAL unit size (-23485766 > 46738).&#xA;[h264 @ 000001fc5a3dac80] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5a3be480] Invalid NAL unit size (2023411154 > 21613).&#xA;[h264 @ 000001fc5a3be480] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5a3e4540] Invalid NAL unit size (519125029 > 48521).&#xA;[h264 @ 000001fc5a3e4540] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5ad06500] Invalid NAL unit size (-2099015076 > 25631).&#xA;[h264 @ 000001fc5ad06500] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5ad22e80] Invalid NAL unit size (-1081182476 > 46590).&#xA;[h264 @ 000001fc5ad22e80] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 2.0 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Multiple frames in a packet.&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[h264 @ 000001fc5a3dac80] Invalid NAL unit size (-2080403149 > 27914).&#xA;[h264 @ 000001fc5a3dac80] Error splitting the input into NAL units.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[aac @ 000001fc5a9ce8c0] channel element 3.9 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Reserved bit set.&#xA;[aac @ 000001fc5a9ce8c0] Prediction is not allowed in AAC-LC.&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 2.6 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Number of scalefactor bands in group (52) exceeds limit (49).&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 3.10 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 2.13 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 3.8 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Reserved bit set.&#xA;[aac @ 000001fc5a9ce8c0] Prediction is not allowed in AAC-LC.&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] channel element 3.9 is not allocated&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Number of bands (50) exceeds limit (49).&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;[aac @ 000001fc5a9ce8c0] Reserved bit set.&#xA;[aac @ 000001fc5a9ce8c0] Number of bands (17) exceeds limit (13).&#xA;Error while decoding stream #0:0: Invalid data found when processing input&#xA;[aac @ 000001fc5a9ce8c0] Sample rate index in program config element does not match the sample rate index configured by the container.&#xA;[aac @ 000001fc5a9ce8c0] Inconsistent channel configuration.&#xA;[aac @ 000001fc5a9ce8c0] get_buffer() failed&#xA;Error while decoding stream #0:0: Invalid argument&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5a3be480] Invalid NAL unit size (-296706614 > 48346).&#xA;[h264 @ 000001fc5a3be480] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5a3e4540] Invalid NAL unit size (-1419758286 > 23497).&#xA;[h264 @ 000001fc5a3e4540] Error splitting the input into NAL units.&#xA;Error while decoding stream #0:1: Invalid data found when processing input&#xA;[h264 @ 000001fc5ad06500] Invalid NAL unit size (86578229 > 53255).&#xA;[h264 @ 000001fc5ad06500] Error splitting the input into NAL units.&#xA;</pre>

    &#xA;

  • ffmpeg "Manifest too large" when downloading youtube video

    22 avril 2024, par ynn

    TL ;DR

    &#xA;

    I'm trying to programmatically download a part of a YouTube video. The widely known procedure doesn't work for some videos and I'd like to overcome this situation.

    &#xA;


    &#xA;

    Context

    &#xA;

    I'm trying to programmatically download a part of a YouTube video. As described in How to download portion of video with youtube-dl command ?, you can achieve this by the following commands.

    &#xA;

    #Converts a human-readable URL to longer URLs for internal use.&#xA;~ $ youtube-dl --get-url &#x27;https://www.youtube.com/watch?v=POrfo478HRI&#x27;&#xA;https://r1---sn-3pm76n76.googlevideo.com/videoplayback?expire=1597593009&amp;ei=UQE5X7bXEYqO4QLs17KACQ&amp;ip=10.100.238.99&amp;id=o-AD0HfadoeimIbuf9t8Anru5X9V7cER08YyOz4iKZOCHL&amp;itag=299&amp;aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C298%2C299%2C302%2C303&amp;source=youtube&amp;requiressl=yes&amp;mh=NV&amp;mm=31%2C26&amp;mn=sn-3pm76n76%2Csn-oguesnze&amp;ms=au%2Conr&amp;mv=m&amp;mvi=1&amp;pl=17&amp;initcwndbps=908750&amp;vprv=1&amp;mime=video%2Fmp4&amp;gir=yes&amp;clen=9205054989&amp;dur=17931.000&amp;lmt=1597347724488304&amp;mt=1597571322&amp;fvip=1&amp;keepalive=yes&amp;fexp=23883098&amp;c=WEB&amp;txp=7316222&amp;sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&amp;sig=AOq0QJ8wRQIgYDqTm0CnLfG0kxsYNrAdtAUYB7alnowiaBArU8R5bBwCIQDeCRDJHFO_PWcnbeFaJvip80deuboN4Pi1x3eRhJBxlQ%3D%3D&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAKTkyTIGVkbWWVx4lqFz77rOdG1FzkM5XuTnYOqtHT4oAiEA9u1R47jPz-mjj4DRXpqqqpUbfaFMW36KbG_pR2jovFM%3D&amp;ratebypass=yes&#xA;https://r1---sn-3pm76n76.googlevideo.com/videoplayback?expire=1597593009&amp;ei=UQE5X7bXEYqO4QLs17KACQ&amp;ip=10.100.238.99&amp;id=o-AD0HfadoeimIbuf9t8Anru5X9V7cER08YyOz4iKZOCHL&amp;itag=251&amp;source=youtube&amp;requiressl=yes&amp;mh=NV&amp;mm=31%2C26&amp;mn=sn-3pm76n76%2Csn-oguesnze&amp;ms=au%2Conr&amp;mv=m&amp;mvi=1&amp;pl=17&amp;initcwndbps=908750&amp;vprv=1&amp;mime=audio%2Fwebm&amp;gir=yes&amp;clen=268945126&amp;dur=17931.001&amp;lmt=1597348111385641&amp;mt=1597571322&amp;fvip=1&amp;keepalive=yes&amp;fexp=23883098&amp;c=WEB&amp;txp=7311222&amp;sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&amp;sig=AOq0QJ8wRgIhAK8XGu3vHucHwqERZ7TQniuvKEd-NTbMkwZbu8EXJ5E3AiEAiS7OYFOcsIrD2xp-AJNzucj1H9ZKMlmkCl_sU7__dZo%3D&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAKTkyTIGVkbWWVx4lqFz77rOdG1FzkM5XuTnYOqtHT4oAiEA9u1R47jPz-mjj4DRXpqqqpUbfaFMW36KbG_pR2jovFM%3D&amp;ratebypass=yes&#xA;&#xA;#Stores the result to a variable.&#xA;~ $ url_video_part=&#x27;https://r1---sn-3pm76n76.googlevideo.com/videoplayback?expire=1597593009&amp;ei=UQE5X7bXEYqO4QLs17KACQ&amp;ip=10.100.238.99&amp;id=o-AD0HfadoeimIbuf9t8Anru5X9V7cER08YyOz4iKZOCHL&amp;itag=299&amp;aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C298%2C299%2C302%2C303&amp;source=youtube&amp;requiressl=yes&amp;mh=NV&amp;mm=31%2C26&amp;mn=sn-3pm76n76%2Csn-oguesnze&amp;ms=au%2Conr&amp;mv=m&amp;mvi=1&amp;pl=17&amp;initcwndbps=908750&amp;vprv=1&amp;mime=video%2Fmp4&amp;gir=yes&amp;clen=9205054989&amp;dur=17931.000&amp;lmt=1597347724488304&amp;mt=1597571322&amp;fvip=1&amp;keepalive=yes&amp;fexp=23883098&amp;c=WEB&amp;txp=7316222&amp;sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&amp;sig=AOq0QJ8wRQIgYDqTm0CnLfG0kxsYNrAdtAUYB7alnowiaBArU8R5bBwCIQDeCRDJHFO_PWcnbeFaJvip80deuboN4Pi1x3eRhJBxlQ%3D%3D&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAKTkyTIGVkbWWVx4lqFz77rOdG1FzkM5XuTnYOqtHT4oAiEA9u1R47jPz-mjj4DRXpqqqpUbfaFMW36KbG_pR2jovFM%3D&amp;ratebypass=yes&#x27;&#xA;&#xA;#Stores the result to a variable.&#xA;~ $ url_audio_part=&#x27;https://r1---sn-3pm76n76.googlevideo.com/videoplayback?expire=1597593009&amp;ei=UQE5X7bXEYqO4QLs17KACQ&amp;ip=10.100.238.99&amp;id=o-AD0HfadoeimIbuf9t8Anru5X9V7cER08YyOz4iKZOCHL&amp;itag=251&amp;source=youtube&amp;requiressl=yes&amp;mh=NV&amp;mm=31%2C26&amp;mn=sn-3pm76n76%2Csn-oguesnze&amp;ms=au%2Conr&amp;mv=m&amp;mvi=1&amp;pl=17&amp;initcwndbps=908750&amp;vprv=1&amp;mime=audio%2Fwebm&amp;gir=yes&amp;clen=268945126&amp;dur=17931.001&amp;lmt=1597348111385641&amp;mt=1597571322&amp;fvip=1&amp;keepalive=yes&amp;fexp=23883098&amp;c=WEB&amp;txp=7311222&amp;sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&amp;sig=AOq0QJ8wRgIhAK8XGu3vHucHwqERZ7TQniuvKEd-NTbMkwZbu8EXJ5E3AiEAiS7OYFOcsIrD2xp-AJNzucj1H9ZKMlmkCl_sU7__dZo%3D&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAKTkyTIGVkbWWVx4lqFz77rOdG1FzkM5XuTnYOqtHT4oAiEA9u1R47jPz-mjj4DRXpqqqpUbfaFMW36KbG_pR2jovFM%3D&amp;ratebypass=yes&#x27;&#xA;&#xA;#Downloads the video for one minute from 12:45.&#xA;~ $ ffmpeg    -ss 12:45 -i "${url_video_part}"    -ss 12:45 -i "${url_audio_part}"    -t 1:00 output.mkv&#xA;frame= 3600 fps= 49 q=-1.0 Lsize=   27047kB time=00:00:59.99 bitrate=3692.9kbits/s speed=0.813x&#xA;

    &#xA;

    This does work perfectly.

    &#xA;


    &#xA;

    Problem

    &#xA;

    For some videos†1, the internal URLs are of the form https://manifest.googlevideo.com/... instead of https://RANDOM-STRING.googlevideo.com/... as in the example above.

    &#xA;

    ~ $ youtube-dl --get-url &#x27;https://www.youtube.com/watch?v=KRMfnvLODZQ&#x27;&#xA;https://manifest.googlevideo.com/api/manifest/dash/expire/1597593866/ei/qgQ5X5maN8-ilQSu15W4CQ/ip/10.100.238.99/id/KRMfnvLODZQ.1/source/yt_live_broadcast/requiressl/yes/hfr/all/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/force_finished/1/vprv/1/keepalive/yes/fexp/23883098/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cforce_finished%2Cvprv%2Citag%2Cplaylist_type/sig/AOq0QJ8wRQIhANYKQvKTN8BRmhp7--4tQp9aqRp_qIGjh472BTYLyJ62AiAautFF86xGDHOe7mYlYaZ1W86EM4k2e6UiJS9Q91dMog%3D%3D&#xA;https://manifest.googlevideo.com/api/manifest/dash/expire/1597593866/ei/qgQ5X5maN8-ilQSu15W4CQ/ip/10.100.238.99/id/KRMfnvLODZQ.1/source/yt_live_broadcast/requiressl/yes/hfr/all/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/force_finished/1/vprv/1/keepalive/yes/fexp/23883098/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cforce_finished%2Cvprv%2Citag%2Cplaylist_type/sig/AOq0QJ8wRQIhANYKQvKTN8BRmhp7--4tQp9aqRp_qIGjh472BTYLyJ62AiAautFF86xGDHOe7mYlYaZ1W86EM4k2e6UiJS9Q91dMog%3D%3D&#xA;

    &#xA;

    And downloading such videos always fails.

    &#xA;

    ~ $ ffmpeg    -ss 12:45 -i "${url_video_part}"    -ss 12:45 -i "${url_audio_part}"    -t 1:00 output.mkv&#xA;[dash @ 0x55fa6a1a4400] Manifest too large: 3776722&#xA;https://manifest.googlevideo.com/...: Invalid data found when processing input&#xA;

    &#xA;

    Please note downloading full of such videos using youtube-dl alone succeeds.

    &#xA;

    †1 : As far as we tested, recently (e.g. yesterday) uploaded videos have such URLs and when we retry the same youtube-dl --get-url command after a day or so, we get "innocent" URLs like in the first example.

    &#xA;


    &#xA;

    Questions

    &#xA;

    How can I download parts of such videos

    &#xA;

      &#xA;
    • by specifying additional options for ffmpeg,

      &#xA;

    • &#xA;

    • by somehow forcefully retrieving internal URLs of the form https://RANDOM-STRING.googlevideo.com/...,

      &#xA;

    • &#xA;

    • or by something which I have no idea at all ?

      &#xA;

    • &#xA;

    &#xA;

    My current workaround is just to wait for a day or two until the internal URLs change, which is much slower than downloading the full video and then cropping it.

    &#xA;


    &#xA;

    Environments

    &#xA;

    ~ $ lsb_release -d&#xA;Description:    Arch Linux&#xA;&#xA;~ $ ffmpeg -version&#xA;ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers&#xA;built with gcc 10.1.0 (GCC)&#xA;configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3&#xA;libavutil      56. 51.100 / 56. 51.100&#xA;libavcodec     58. 91.100 / 58. 91.100&#xA;libavformat    58. 45.100 / 58. 45.100&#xA;libavdevice    58. 10.100 / 58. 10.100&#xA;libavfilter     7. 85.100 /  7. 85.100&#xA;libswscale      5.  7.100 /  5.  7.100&#xA;libswresample   3.  7.100 /  3.  7.100&#xA;libpostproc    55.  7.100 / 55.  7.100&#xA;&#xA;~ $ youtube-dl --version&#xA;2020.07.28&#xA;

    &#xA;