
Recherche avancée
Médias (1)
-
La conservation du net art au musée. Les stratégies à l’œuvre
26 mai 2011
Mis à jour : Juillet 2013
Langue : français
Type : Texte
Autres articles (41)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Contribute to a better visual interface
13 avril 2011MediaSPIP is based on a system of themes and templates. Templates define the placement of information on the page, and can be adapted to a wide range of uses. Themes define the overall graphic appearance of the site.
Anyone can submit a new graphic theme or template and make it available to the MediaSPIP community. -
Submit enhancements and plugins
13 avril 2011If you have developed a new extension to add one or more useful features to MediaSPIP, let us know and its integration into the core MedisSPIP functionality will be considered.
You can use the development discussion list to request for help with creating a plugin. As MediaSPIP is based on SPIP - or you can use the SPIP discussion list SPIP-Zone.
Sur d’autres sites (9210)
-
ffplay cannot play more than one song
5 février 2020, par Bernie gachi have taken ffplay.c file from http://ffmpeg.org/doxygen/trunk/ffplay_8c-source.html and re edited it to a cpp file to embed in my win32 gui application . i have made the following changes to it.
- made the int main function into a local function as follows, i can pass the HWND to embedd the player
void Ffplay::play_song(string file, HWND parent, bool* successfull)
{
int flags;
VideoState* is;
input_filename = file;
/* register all codecs, demux and protocols */
#if CONFIG_AVDEVICE
avdevice_register_all();
#endif
//avformat_network_init();
//check whether the filename is valid
if (input_filename.empty())
{
logger.log(logger.LEVEL_ERROR, "filename %s is not valid\n", file);
return;
}
if (display_disable)
{
video_disable = 1;
}
flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
if (audio_disable)
flags &= ~SDL_INIT_AUDIO;
else
{
/* Try to work around an occasional ALSA buffer underflow issue when the
* period size is NPOT due to ALSA resampling by forcing the buffer size. */
if (!SDL_getenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE"))
SDL_setenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE", "1", 1);
}
if (display_disable)
flags &= ~SDL_INIT_VIDEO;
SDL_SetMainReady();
if (SDL_Init(flags))
{
logger.log(logger.LEVEL_ERROR, "Could not initialize SDL - %s\n", SDL_GetError());
logger.log(logger.LEVEL_ERROR, "(Did you set the DISPLAY variable?)\n");
return;
}
//Initialize optional fields of a packet with default values.
//Note, this does not touch the data and size members, which have to be initialized separately.
av_init_packet(&flush_pkt);
flush_pkt.data = (uint8_t*)&flush_pkt;
if (!display_disable)
{
int flags = SDL_WINDOW_HIDDEN;
if (alwaysontop)
#if SDL_VERSION_ATLEAST(2,0,5)
flags |= SDL_WINDOW_ALWAYS_ON_TOP;
#else
logger.log(logger.LEVEL_INFO, "SDL version doesn't support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n");
#endif
if (borderless)
flags |= SDL_WINDOW_BORDERLESS;
else
flags |= SDL_WINDOW_RESIZABLE;
SDL_InitSubSystem(flags);
ShowWindow(parent, true);
//window = SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);
window = SDL_CreateWindowFrom(parent);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
if (window) {
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (!renderer)
{
logger.log(logger.LEVEL_ERROR, "Failed to initialize a hardware accelerated renderer: %s\n", SDL_GetError());
renderer = SDL_CreateRenderer(window, -1, 0);
}
if (renderer)
{
if (!SDL_GetRendererInfo(renderer, &renderer_info))
{
logger.log(logger.LEVEL_INFO, "Initialized %s renderer.\n", renderer_info.name);
}
}
}
if (!window || !renderer || !renderer_info.num_texture_formats)
{
logger.log(logger.LEVEL_ERROR, "Failed to create window or renderer: %s\n", SDL_GetError());
return;
}
}
is = stream_open(input_filename.c_str(), file_iformat);
if (!is)
{
logger.log(logger.LEVEL_ERROR, "Failed to initialize VideoState!\n");
return;
}
//the song is playing now
*successfull = true;
event_loop(is);
//the song has quit;
*successfull = false;
}- changed the callback functions as the static ones couldn’t be used by c++ eg,
void Ffplay::static_sdl_audio_callback(void* opaque, Uint8* stream, int len)
{
static_cast(opaque)->sdl_audio_callback(opaque, stream, len);
}closing doesn’t change from the main file to close the audio and sdl framework
void Ffplay::do_exit(VideoState* is)
{
abort = true;
if(is)
{
stream_close(is);
}
if (renderer)
SDL_DestroyRenderer(renderer);
if (window)
SDL_DestroyWindow(window);
#if CONFIG_AVFILTER
av_freep(&vfilters_list);
#endif
avformat_network_deinit();
SDL_Quit();
}i call the functions as follows from main gui
ft=std::async(launch::async, &Menu::play_song, this, songs_to_play.at(0));
the
menu::play_song
function is :void Menu::play_song(wstring song_path)
{
ready_to_play_song = false;
OutputDebugString(L"\nbefore song\n");
using std::future;
using std::async;
using std::launch;
string input{ song_path.begin(),song_path.end() };
Ffplay ffplay;
ffplay.play_song(input, h_sdl_window, &song_opened);
OutputDebugString(L"\nafter song\n");
ready_to_play_song = true;
}THE PROBLEM is i can only play one song . if i call the
menu::play_song
function again the sound is missing and the video/art cover is occasionally missing also. it seems some resources are not been released or something like that.i have localised the proble to this function
int Ffplay::packet_queue_get(PacketQueue* q, AVPacket* pkt, int block, int* serial)
{
MyAVPacketList* pkt1;
int ret;
int count=0;
SDL_LockMutex(q->mutex);
for (;;)
{
if (q->abort_request)
{
ret = -1;
break;
}
pkt1 = q->first_pkt;
if (pkt1) {
q->first_pkt = pkt1->next;
if (!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size + sizeof(*pkt1);
q->duration -= pkt1->pkt.duration;
*pkt = pkt1->pkt;
if (serial)
*serial = pkt1->serial;
av_free(pkt1);
ret = 1;
break;
}
else if (!block) {
ret = 0;
break;
}
else
{
logger.log(logger.LEVEL_INFO, "packet_queue before");
SDL_CondWait(q->cond, q->mutex);
logger.log(logger.LEVEL_INFO, "packet_queue after");
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}the call to
SDL_CondWait(q->cond, q->mutex);
never returns -
Discord.py : Access files on the computer of the person who sent a message. Play a song from the local drive of any user on the server
7 avril 2021, par daDibI have a bot that can play music from my computer. Is there a way to play a song from the computer of the person who sent the message ? My thought would be using
message.author
to somehow access the person's session and get into their drive. Here is my bot. It can join a voice channel, create playlists from local file paths, start a playlist or individual file with stop/pause/play/next/previous controls :

import discord
import os.path
import logging
import asyncio
from os import path

global ready 
global vc
global source
global songQueue
global songIndex
global commandList
global stopPlaylist

ready = False
stopPlaylist = False
songQueue = []
songIndex = 0

logger = logging.getLogger('discord')
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='D:\DnD\DiscordBot\discord.log', encoding='utf-8', mode='w')
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
logger.addHandler(handler)

client = discord.Client()
commands = [
 '!connect\nConnect to a voice channel by channel id. Use !channels to find the desired id.\nExample Command: !connect 827202170973323305\n\n',
 '!channels\nLists all voice channels and their connection id.\n\n',
 '!add\nAdd a file path to the playlist.\nExample Command: !add D:\\DnD\\DiscordBot\\mySong.mp3\n\n',
 '!delete\nDeletes the last song added to the playlist.\n\n',
 '!view\nDisplays the current playlist, in order.\n\n',
 '!playlist\nStarts the playlist from the beginning, or optionally add a number as the start position.\nExample Command: !playlist 3\n\n',
 '!playSong\nPlays a specified file.\nExample Command: !playSong D:\\DnD\\DiscordBot\\mySong.mp3\n\n',
 '!next\nPlays next song in playlist.\n\n',
 '!prev\nPlays previous song in playlist.\n\n',
 '!stop\nStops all music song. Playlist will restart from the beginning.\n\n',
 '!pause\nPauses the current song. Restart with !resumeSong.\n\n',
 '!resume\nResumes the current song.\n\n'
 '!status\nLets you know if the bot thinks it is playing music.'
 ]
commandList=''
for command in commands:
 commandList+=command

@client.event
async def on_ready():
 print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
 global ready 
 global vc
 global source
 global songQueue
 global songIndex
 global commandList
 global stopPlaylist

 if message.author == client.user:
 return
#!help
 if message.content.startswith('!help'):
 await message.channel.send('{0}'.format(commandList))
 return
#!connect
 if message.content.startswith('!connect'): 
 if ready:
 await message.channel.send('Bot [{0}] is already connected to a voice channel.'.format(client.user))
 return
 channel = int(message.content[9:])
 vc = await client.get_channel(channel).connect()
 ready = True
 await message.channel.send('Bot [{0}] is connecting to voice.'.format(client.user))
 return
#!channels
 if message.content.startswith('!channels'):
 channelList = ''
 for channel in client.get_all_channels():
 if channel.type == discord.ChannelType.voice:
 channelList += 'name: ' + channel.name + '\n'
 channelList += 'id: ' + str(channel.id) + '\n\n'
 await message.channel.send('{0}'.format(channelList))
 return
#!add
 if message.content.startswith('!add'):
 song = message.content[5:]
 if not path.exists(song):
 await message.channel.send('Song not found or invalid path specified.\nSpecified Path: {0}\nExample command: !addSong C:\\Users\\Public\\Music\\mySong.mp3'.format(song))
 return
 songQueue.append(song)
 await message.channel.send('Song added: {0}\nCurrent playist length: {1} song(s)'.format(song,len(songQueue)))
 return
#!delete
 if message.content.startswith('!delete'):
 if len(songQueue) == 0:
 await message.channel.send('Playlist is empty. Use !addSong, !viewList, and !playList to manage playlists.')
 return
 await message.channel.send('Removed song: {0}'.format(songQueue.pop()))
 return
#!view
 if message.content.startswith('!view'):
 if len(songQueue) == 0:
 await message.channel.send('Playlist is empty. Use !addSong, !deleteSong, and !playList to manage playlists.')
 return
 await message.channel.send('Current Playlist:\n{0}'.format('\n'.join(songQueue)))
 return
#play commands
 if message.content.startswith('!play'):
 if not ready:
 await message.channel.send('Bot [{0}] is not connected to a voice channel.'.format(client.user))
 return
#!playlist 
 if message.content.startswith('!playlist'):
 try:
 songIndex = int(message.content[10:]) - 1
 if songIndex >= len(songQueue):
 songIndex = len(songQueue) - 1
 except:
 pass 
 playSong()
 return
#!playSong
 if message.content.startswith('!playSong'):
 song = message.content[10:]
 if not path.exists(song):
 await message.channel.send('Song not found or invalid path specified.\nSpecified Path: {0}\nExample command: !play C:\\Users\\Public\\Music\\mySong.mp3'.format(song))
 return
 source = discord.FFmpegPCMAudio(song)
 vc.play(source, after=None)
 await message.channel.send('Playing song: {0}'.format(song))
 return
#!next
 if message.content.startswith('!next'):
 vc.stop()
#!prev
 if message.content.startswith('!prev'):
 songIndex -= 2
 if songIndex < -1:
 songIndex = -1
 vc.stop()
#!stop
 if message.content.startswith('!stop'):
 if not ready:
 await message.channel.send('Bot [{0}] is not connected to a voice channel.'.format(client.user))
 return
 vc.stop()
 songIndex = 0
 stopPlaylist = True
 await message.channel.send('Stopping music.')
 return
#!pause
 if message.content.startswith('!pause'):
 if not ready:
 await message.channel.send('Bot [{0}] is not connected to a voice channel.'.format(client.user))
 return
 vc.pause()
 await message.channel.send('Pausing music.')
 return
#!resume
 if message.content.startswith('!resume'):
 if not ready:
 await message.channel.send('Bot [{0}] is not connected to a voice channel.'.format(client.user))
 return
 vc.resume()
 await message.channel.send('Resuming music.')
 return
#!status
 if message.content.startswith('!status'):
 if not ready:
 await message.channel.send('Bot [{0}] is not connected to a voice channel.'.format(client.user))
 return
 if vc.is_playing():
 await message.channel.send('Something is playing.')
 return
 await message.channel.send('Nothing is playing.')
 return

def playSong():
 global songQueue
 global songIndex
 global vc
 try:
 song = songQueue[songIndex]
 source = discord.FFmpegPCMAudio(song)
 vc.play(source, after=nextSong)
 except Exception as e:
 print('playSong error {0}'.format(e))

def nextSong(error):
 global songQueue
 global songIndex
 global stopPlaylist
 try:
 songIndex += 1
 if songIndex >= len(songQueue):
 stopPlaylist = True
 if stopPlaylist:
 songIndex = 0
 stopPlaylist = False
 return
 futureFunction = asyncio.run_coroutine_threadsafe(playSong(), client.loop)
 futureFunction.result()
 except Exception as e:
 print('nextSong error {0}'.format(e))

#@client.event
#async def on_logout(user)
# global ready
# if user == client.user:
# ready = False

client.run('TOKEN')



-
Is it possible to download a song playlist through following description with yt-dlp ?
26 février 2023, par BhaturaGuySince downloading a thumbnail from youtube music provides really bad quality,
is it possible to download it in following manner :


Download the link as bestvideo+bestaudio formatt and when the video is downloaded then extract frame number 24 then use that as thumbnail and mux it and audio to .mp3 ?


Screenshot of bestvideo :
sc


Screenshot of normally download with yt-dlp :
sc2