3

J'ai besoin d'une solution pour lire un segment de mp3. J'ai quelques milliers de fichiers audio qui sont actuellement stockés sur Amazon S3, et je voudrais permettre aux utilisateurs de les lire, mais je voudrais limiter la durée de lecture à 30 secondes environ au milieu de l'enregistrement. Je ne suis pas sûr si j'ai besoin de créer un tout nouveau fichier (snippet) comme je le ferais pour une vignette s'il s'agissait d'une image, ou s'il est possible d'utiliser un lecteur/vapeur pour le limiter de manière sûre ils ne peuvent pas accéder à la chanson entière.extraits de mp3 sur s3

Je viens d'un environnement Rails et j'utilise Paperclip pour gérer les fichiers et JPlayer pour les lire si c'est important.

Des pointeurs ou des bonnes pratiques?

Répondre

0

Malheureusement, vous devrez créer de nouveaux extraits - il n'y a pas vraiment moyen de dire au navigateur d'un utilisateur "de télécharger tout ce fichier mp3, mais seulement de jouer et d'autoriser l'accès aux 30 secondes du milieu".

0

Je pense qu'il est plus simple de résoudre le problème côté client.

Utilisez-vous le flash pour lire les fichiers audio?

Si oui, j'ai fait quelque chose de similaire (mais avec des vidéos) en utilisant JWPlayer (il supporte aussi les fichiers audio).

Vous pouvez développer un plugin personnalisé pour contrôler l'extrait que vous voulez lire, puis arrêter le fichier audio et afficher un message ou quelque chose comme ça.

Cette solution combinée aux URLs signés et/ou au streaming rtmp avec CloudFront peut être très sûre.

+0

Ouais .. Comme si quelque chose allait arrêter l'utilisateur * avancé * pour utiliser wget ou corriger le script dans Firebug pour obtenir le clip complet. De plus, si les fichiers sont suffisamment gros pour faire des aperçus, vous allez tout transmettre au client et en éliminer immédiatement 99%. – yurymik

0

En raison de la limitation de format mp3, vous ne pouvez pas rechercher l'image arbitraire au milieu du morceau et commencer la transmission à partir de ce point.

Donc, il y a essentiellement trois options:

    1. Créer de nouveaux fichiers hors connexion. Très facile, mais encombrant.
    2. Transcoder des fichiers à la volée. CPU consomme, dégrade la qualité.
    3. La lecture de fin de course avec les premières X secondes: il suffit de jeter un regard dans la chanson » en-tête, obtenir son débit et calculer la taille du morceau d'octets pour servir

et ne transmettent pas de plus en plus que vous avez besoin: les gens vont réussir à intercepter le flux et l'enregistrer sur le disque (côté entreprise); enregistrer le trafic de vos utilisateurs (bon karma).

4

Ceci est possible en utilisant l'en-tête HTTP "Content-range". Cet en-tête dit "s'il vous plaît donnez-moi les octets d'ici à ici et ignorez le reste". Si le serveur Web est configuré pour les traiter (Apache est par exemple), alors vous obtenez une réponse 206 avec un corps de seulement ces octets.

Vous devez créer une petite application proxy qui fait office de passerelle entre l'écouteur et Amazon.

Pour voir si votre hôte répondra essayez ceci à partir de la ligne de commande:

curl -v -I http://www.mfiles.co.uk/mp3-downloads/01-Tartaros%20of%20light.mp3 

Lorsque l'URL est l'un des vôtres.Si vous êtes chanceux, vous verrez:

Accept-Ranges: bytes 
Content-Length: 5284483 

Cela signifie que le serveur accepte les l'en-tête Content-gamme et la longueur du fichier est 5284483 octets.

Soit la demande du premier tiers du fichier:

curl -H'Range: bytes=0-1761494' http://www.mfiles.co.uk/mp3-downloads/01-Tartaros%20of%20light.mp3 > /tmp/test1.mp3 

Vous devriez maintenant être en mesure de jouer /tmp/test1.mp3 et entendre le premier tiers de la piste.

L'étape suivante consiste à créer une application proxy. Une bonne approche serait d'utiliser https://github.com/aniero/rack-streaming-proxy mais vous auriez probablement besoin de forker le projet pour envoyer l'en-tête 'Range: bytes = 0-1761494'. Sinon, jetez un oeil à Sinatra. Un bonus ici est que parce que vous utilisez le serveur distant par proxy, vous pouvez masquer l'URL réelle du fichier en ayant une simple table de base de données avec un ID pour chaque fichier. Je suggère d'écrire un petit script qui stocke également la longueur en octets de chaque fichier, de sorte que vous n'avez pas à calculer la plage pour chaque demande.

Ainsi, un GET à "/ preview/12345" serait proxy "http://amazon.com/my_long_url" et vous donner seulement le premier tiers du fichier. En plus de cela, vous pouvez mettre Varnish devant votre propre serveur, ce qui cache ces fichiers MP3 partiels et signifie que vous n'avez pas à revenir constamment sur Amazon pour obtenir les fichiers.