
Recherche avancée
Médias (1)
-
Bug de détection d’ogg
22 mars 2013, par
Mis à jour : Avril 2013
Langue : français
Type : Video
Autres articles (41)
-
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs -
Support audio et vidéo HTML5
10 avril 2011MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...) -
HTML5 audio and video support
13 avril 2011, parMediaSPIP 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 (...)
Sur d’autres sites (7870)
-
ffmpeg : error while loading shared libraries : libvpx.so.6 : cannot open shared object file : No such file or directory
16 avril 2021, par PanosI am building a multi tool discord bot in Python rewrite.


So I decided to add music to it as well. When I completed the bot and tried it on my local pc it worked perfectly. However when I uploaded to Heroku I got some errors for ffmpeg.


Initially I thought Heroku is Linux based so I downloaded ffmpeg for Linux. Still didn't work. Then i added a apt buildpack and downloaded it that way. It worked however now a get a different error. It finds the ffmpeg but the song is not played and this is displayed in the console :




[ffmpeg : error while loading shared libraries : libvpx.so.6 : cannot
open shared object file : No such file or directory]




How can I resolve this issue ?


Here is the whole code :


import discord
from discord.ext import commands

import asyncio
import itertools
import sys
import traceback
from async_timeout import timeout
from functools import partial
from youtube_dl import YoutubeDL
import ctypes
import ctypes.util

@commands.Cog.listener()
async def on_ready(self):

 print("ctypes - Find opus:")
 a = ctypes.util.find_library('opus')
 print(a)
 
 print("Discord - Load Opus:")
 b = discord.opus.load_opus(a)
 print(b)
 
 print("Discord - Is loaded:")
 c = discord.opus.is_loaded()
 print(c)



ytdlopts = {
 'format': 'bestaudio/best',
 'outtmpl': 'downloads/%(extractor)s-%(id)s-%(title)s.%(ext)s',
 'restrictfilenames': True,
 'noplaylist': True,
 'nocheckcertificate': True,
 'ignoreerrors': False,
 'logtostderr': False,
 'quiet': True,
 'no_warnings': True,
 'default_search': 'auto',
 'source_address': '0.0.0.0'
}

ffmpegopts = {
 'before_options': '-nostdin',
 'options': '-vn'
}

ytdl = YoutubeDL(ytdlopts)


class VoiceConnectionError(commands.CommandError):


class InvalidVoiceChannel(VoiceConnectionError):



class YTDLSource(discord.PCMVolumeTransformer):

 def __init__(self, source, *, data, requester):
 super().__init__(source)
 self.requester = requester

 self.title = data.get('title')
 self.web_url = data.get('webpage_url')


 def __getitem__(self, item: str):
 return self.__getattribute__(item)

 @classmethod
 async def create_source(cls, ctx, search: str, *, loop, download=False):
 loop = loop or asyncio.get_event_loop()

 to_run = partial(ytdl.extract_info, url=search, download=download)
 data = await loop.run_in_executor(None, to_run)

 if 'entries' in data:
 data = data['entries'][0]

 await ctx.send(f'```ini\n[Added {data["title"]} to the Queue.]\n```')

 if download:
 source = ytdl.prepare_filename(data)
 else:
 return {'webpage_url': data['webpage_url'], 'requester': ctx.author, 'title': data['title']}

 return cls(discord.FFmpegPCMAudio(source), data=data, requester=ctx.author)

 @classmethod
 async def regather_stream(cls, data, *, loop):
 """Used for preparing a stream, instead of downloading.
 Since Youtube Streaming links expire."""
 loop = loop or asyncio.get_event_loop()
 requester = data['requester']

 to_run = partial(ytdl.extract_info, url=data['webpage_url'], download=False)
 data = await loop.run_in_executor(None, to_run)

 return cls(discord.FFmpegPCMAudio(data['url']), data=data, requester=requester)


class MusicPlayer(commands.Cog):

 __slots__ = ('bot', '_guild', '_channel', '_cog', 'queue', 'next', 'current', 'np', 'volume')

 def __init__(self, ctx):
 self.bot = ctx.bot
 self._guild = ctx.guild
 self._channel = ctx.channel
 self._cog = ctx.cog

 self.queue = asyncio.Queue()
 self.next = asyncio.Event()

 self.np = None
 self.volume = .5
 self.current = None

 ctx.bot.loop.create_task(self.player_loop())

 async def player_loop(self):
 """Our main player loop."""
 await self.bot.wait_until_ready()

 while not self.bot.is_closed():
 self.next.clear()

 try:
 source = await self.queue.get()
 except asyncio.TimeoutError:
 return self.destroy(self._guild)

 if not isinstance(source, YTDLSource):
 try:
 source = await YTDLSource.regather_stream(source, loop=self.bot.loop)
 except Exception as e:
 await self._channel.send(f'There was an error processing your song.\n'
 f'```css\n[{e}]\n```')
 continue

 source.volume = self.volume
 self.current = source

 self._guild.voice_client.play(source, after=lambda _: self.bot.loop.call_soon_threadsafe(self.next.set))
 self.np = await self._channel.send(f'**Now Playing:** `{source.title}` requested by '
 f'`{source.requester}`')
 await self.next.wait()

 source.cleanup()
 self.current = None

 try:
 await self.np.delete()
 except discord.HTTPException:
 pass

 def destroy(self, guild):
 """Disconnect and cleanup the player."""
 return self.bot.loop.create_task(self._cog.cleanup(guild))


class Music(commands.Cog):
 """Music related commands."""

 __slots__ = ('bot', 'players')

 def __init__(self, bot):
 self.bot = bot
 self.players = {}

 async def cleanup(self, guild):
 try:
 await guild.voice_client.disconnect()
 except AttributeError:
 pass

 try:
 del self.players[guild.id]
 except KeyError:
 pass

 async def __local_check(self, ctx):
 """A local check which applies to all commands in this cog."""
 if not ctx.guild:
 raise commands.NoPrivateMessage
 return True

 async def __error(self, ctx, error):
 """A local error handler for all errors arising from commands in this cog."""
 if isinstance(error, commands.NoPrivateMessage):
 try:
 return await ctx.send('This command can not be used in Private Messages.')
 except discord.HTTPException:
 pass
 elif isinstance(error, InvalidVoiceChannel):
 await ctx.send('Error connecting to Voice Channel. '
 'Please make sure you are in a valid channel or provide me with one')

 print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr)
 traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr)

 def get_player(self, ctx):
 """Retrieve the guild player, or generate one."""
 try:
 player = self.players[ctx.guild.id]
 except KeyError:
 player = MusicPlayer(ctx)
 self.players[ctx.guild.id] = player

 return player

 @commands.command(name='connect', aliases=['join'])
 async def connect_(self, ctx):
 try:
 channel = ctx.author.voice.channel
 except AttributeError:
 raise InvalidVoiceChannel('No channel to join.')

 vc = ctx.voice_client

 if vc:
 if vc.channel.id == channel.id:
 return
 try:
 await vc.move_to(channel)
 except asyncio.TimeoutError:
 raise VoiceConnectionError(f'Moving to channel: <{channel}> timed out.')
 else:
 try:
 await channel.connect()
 except asyncio.TimeoutError:
 raise VoiceConnectionError(f'Connecting to channel: <{channel}> timed out.')

 await ctx.send(f'Connected to: **{channel}**', )

 @commands.command(name='play', aliases=['sing'])
 async def play_(self, ctx, *, search: str):
 await ctx.trigger_typing()

 vc = ctx.voice_client

 if not vc:
 await ctx.invoke(self.connect_)

 player = self.get_player(ctx)
 source = await YTDLSource.create_source(ctx, search, loop=self.bot.loop, download=False)

 await player.queue.put(source)

 @commands.command(name='pause')
 async def pause_(self, ctx):
 """Pause the currently playing song."""
 vc = ctx.voice_client

 if not vc or not vc.is_playing():
 return await ctx.send('I am not currently playing anything!')
 elif vc.is_paused():
 return

 vc.pause()
 await ctx.send(f'**`{ctx.author}`**: Paused the song!')

 @commands.command(name='resume')
 async def resume_(self, ctx):
 """Resume the currently paused song."""
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently playing anything!', )
 elif not vc.is_paused():
 return

 vc.resume()
 await ctx.send(f'**`{ctx.author}`**: Resumed the song!')

 @commands.command(name='skip')
 async def skip_(self, ctx):
 """Skip the song."""
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently playing anything!')

 if vc.is_paused():
 pass
 elif not vc.is_playing():
 return

 vc.stop()
 await ctx.send(f'**`{ctx.author}`**: Skipped the song!')

 @commands.command(name='queue', aliases=['q', 'playlist'])
 async def queue_info(self, ctx):
 """Retrieve a basic queue of upcoming songs."""
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently connected to voice!')

 player = self.get_player(ctx)
 if player.queue.empty():
 return await ctx.send('There are currently no more queued songs.')

 upcoming = list(itertools.islice(player.queue._queue, 0, 5))

 fmt = '\n'.join(f'**`{_["title"]}`**' for _ in upcoming)
 embed = discord.Embed(title=f'Upcoming - Next {len(upcoming)}', description=fmt)

 await ctx.send(embed=embed)

 @commands.command(name='now_playing', aliases=['np', 'current', 'currentsong', 'playing'])
 async def now_playing_(self, ctx):
 """Display information about the currently playing song."""
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently connected to voice!', )

 player = self.get_player(ctx)
 if not player.current:
 return await ctx.send('I am not currently playing anything!')

 try:
 await player.np.delete()
 except discord.HTTPException:
 pass

 player.np = await ctx.send(f'**Now Playing:** `{vc.source.title}` '
 f'requested by `{vc.source.requester}`')

 @commands.command(name='volume', aliases=['vol'])
 async def change_volume(self, ctx, *, vol: float):
 """Change the player volume.
 Parameters
 ------------
 volume: float or int [Required]
 The volume to set the player to in percentage. This must be between 1 and 100.
 """
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently connected to voice!', )

 if not 0 < vol < 101:
 return await ctx.send('Please enter a value between 1 and 100.')

 player = self.get_player(ctx)

 if vc.source:
 vc.source.volume = vol / 100

 player.volume = vol / 100
 await ctx.send(f'**`{ctx.author}`**: Set the volume to **{vol}%**')

 @commands.command(name='stop', aliases=['leave'])
 async def stop_(self, ctx):
 vc = ctx.voice_client

 if not vc or not vc.is_connected():
 return await ctx.send('I am not currently playing anything!')

 await self.cleanup(ctx.guild)


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



-
Creating video from audio and resized image using FFMPEG
26 septembre 2018, par nemeskeriorsIm trying to create an mp4 video from an mp3 and an image with ffmpeg. The video should be the size of 640x360 with black background and the image should be resized to fit in this dimensions and centred in the middle. The video’s length must match the mp3’s length.
Its basically a video creation for youtube from a song and an artwork.
For now i was able to achieve this with 3 steps :
- resize image :
-i %image% -vf scale='if(gt(a,4/3),640,-1)':'if(gt(a,4/3),-1,360)' %resized_image%
- create a music video with black background :
-f lavfi -i color=s=640x360 -i %audio_file% -c:v libx264 -s:v 640x360 -c:a aac -strict experimental -b:a 320k -shortest -pix_fmt yuv420p %video%
- put the resized image centred in the video :
-i %video% -i %resized_image% -filter_complex "overlay=(W-w)/2:(H-h)/2" -codec:a copy %final_video%
Is it possible to achieve all this with one ffmpeg command ?
-
Compiling FFMPEG on CentOS DigitalOcean
29 juillet 2015, par coder_ukI set up a DigitalOcean instance running CentOS 6.5 and successfully followed the guide to compile FFMPEG (https://trac.ffmpeg.org/wiki/CompilationGuide/Centos). Hurrah !
But of course I realised that by default, DigitalOcean creates a root user and so ffmpeg now lives in /root/bin/ffmpeg. Which isn’t ideal because when I want to exec the ffmpeg bin from nginx, I would have to run nginx as root for it to have permission.
Questions ...
1) Long-shot, but presumably if I change the owner of the ffmpeg binary to nginx, it still won’t work, because nginx won’t be able to access the /root folder it is in. Correct ?
2) I could run nginx as root (’user root’). But this seems like a very bad idea. Correct ?
3) Which leaves me with the option of creating a new user, and then compiling ffmpeg into its home folder. But : which user ? EC2 creates ’ec2-user’, so should I make my own equivalent for DO ? But then won’t I have to run nginx as that user, else I’ll run into the same problem ?
Or should I compile ffmpeg into the ’nginx’ home folder, if indeed it has one ? Is that how it is supposed to be done ?
Since compiling ffmpeg takes ages, I don’t want to keep doing it, and the static files all seem very out of date. Thanks