1
votes

Comment puis-je concaténer deux fichiers mp3 très différents (bitrate diff, canaux, samplerate, bitdeph)?

En entrée, j'obtiens un fichier mp3 (input.mp3), puis je dois le diviser en deux parties séparées (c'est fait) et insérer entre ces parties un autre mp3 (second.mp3).

Le problème: J'ai essayé d'utiliser chaque commande pour concaténer des fichiers, les convertir en .ts, etc. Mais je n'obtiens toujours que le son du premier fichier mp3 et le son du second est perdu. Je suppose que je dois transformer mon fichier mp3 exactement au même format que le fichier input.mp3 (débits, taux d'échantillonnage, nombre de canaux) avant de pouvoir le concaténer.

Je pourrais concaténer les deux parties de input.mp3, mais quoi que je fasse, je ne peux pas concaténer avec second.mp3.

J'utilise php avec des fichiers exec et ffmpeg.exe. Est-il possible de le coder pour que peu importe l'entrée, je peux transformer second.mp3 en un fichier adapté à la concaténation de mp3?


0 commentaires

3 Réponses :


2
votes

Comment puis-je concaténer deux fichiers mp3 très différents (débit binaire, canaux, échantillonnage, profondeur de bits)?

Commençons par chaque composant ...

débit binaire

Celui-ci n'a pas d'importance. Les flux MP3 peuvent (et le font!) Modifier le débit binaire à mi-parcours. Tant que vous vous inscrivez sur un en-tête de cadre, tout va bien.

profondeur de bits

Le concept de profondeur de bits de l'échantillon n'existe pas dans MP3. Vous pouvez capturer en 24 bits, encoder en MP3 et le décodeur décodera en 16 bits. (Ou, avec certains commutateurs de ligne de commande, vice versa!) Ce n'est pas un problème car la profondeur de bits ne s'applique pas.

taux d'échantillonnage

C'est généralement un problème. La plupart des joueurs ne supposent pas qu'ils vont changer la fréquence d'échantillonnage de sortie à mi-chemin. La plupart des joueurs n'essaient pas de rééchantillonner pour s'en tenir à la vitesse à laquelle ils sortaient déjà. Je ne suis pas surpris que vous ayez des problèmes avec une fréquence d'échantillonnage changeante.

chaînes

Ceci est similaire au problème de fréquence d'échantillonnage en ce qu'il nécessite de changer la configuration du périphérique de sortie. Même si le lecteur le prend en charge, ce ne sera pas transparent. (À moins que vous ne passiez de la stéréo au mono, où le mono pourrait être facilement mixé en stéréo.)

En entrée, j'obtiens un fichier mp3 (input.mp3), puis je dois le diviser en deux parties distinctes (c'est fait) et insérer entre ces parties un autre mp3 (second.mp3).

Cela pose en fait un autre problème que vous n'avez pas posé de questions sur ... le timing. MP3 fonctionne dans des cadres relativement grands (généralement 576 échantillons), ce qui devient la résolution à laquelle vous pouvez épisser. Pas bon. De plus, les débuts des pistes ont souvent une ou deux images d'initialisation.

Un troisième problème est le réservoir de bits. C'est là que le contenu d'un cadre est stocké dans un cadre différent qui peut avoir un espace supplémentaire.

À la fin de la journée, vous allez devoir tout décoder en échantillons PCM normaux, faire votre épissage et ré-encoder en MP3. Vous devrez également tout rééchantillonner à une fréquence d'horloge commune et mélanger à un nombre de canaux particulier. Heureusement, une fois décodé en PCM, tout cela est trivial et standard. Une fois vos flux d'entrée compatibles, vous effectuez une épissure arbitraire sur une trame PCM qui est la plus granulaire possible.


1 commentaires

Hou la la! Merci! Maintenant, je pense que je comprends mieux ce que j'essaye de faire <33



0
votes

Utilisez atrim , asetpts et concat filtres:

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[begin];[1:a]aformat=sample_rates=44100:channel_layouts=stereo[middle];[0:a]atrim=start=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[end];[begin][middle][end]concat=n=3:v=0:a=1[a]" -map "[a]" output

Remarque: Tous les flux correspondants doivent avoir les mêmes paramètres dans tous les segments; le système de filtrage sélectionne automatiquement un format d'échantillon, une fréquence d'échantillonnage et une disposition de canal communs pour les flux audio. Ces paramètres communs varient en fonction des paramètres d'entrée, donc ajoutez le filtre aformat (ou équivalent) si vous voulez des résultats cohérents:

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,asetpts=N/SR/TB[begin];[0:a]atrim=start=10,asetpts=N/SR/TB[end];[begin][1:a][end]concat=n=3:v=0:a=1[a]" -map "[a]" output


4 commentaires

Merci beaucoup, la première commande a réellement fonctionné, pourrait-on dire que la qualité de output.mp3 sera toujours la même que celle de input.mp3, en conservant tous les paramètres importants de input.mp3? Je suis un peu noob avec le montage audio <3


@lukistar Non. Le débit d'entrée n'a pas vraiment d'importance car le décodeur décodera complètement l'audio en audio PCM brut, puis il sera exécuté via le -filter_complex , puis encodé. De toute façon, la qualité ne peut pas être la même car le MP3 est avec perte. Écoutez-le simplement: si cela sonne assez bien, vous pouvez utiliser les valeurs par défaut sans rien faire de plus. Si cela ne sonne pas assez bien, fournissez un débit plus élevé, voir FFmpeg Wiki: MP3 .


Hé, désolé de vous poser une question un peu différente, mais maintenant je dois faire une chose similaire à ce que votre commande a fait - mais au lieu de couper le premier audio, je dois superposer le deuxième audio à la position du premier audio donc à cela positionner le premier et le deuxième audio en même temps ... mais encore une fois en utilisant les paramètres du premier audio ... quelque chose comme donner des secondes à la sorcière la deuxième étoile audio jouant avec la première, en entendant les deux


@lukistar Ce site encourage les utilisateurs à poser une question distincte par message, donc cela devrait être une nouvelle question.



1
votes

Si vous souhaitez concaténer ou fusionner des fichiers MP3 à débit binaire différent et mono et stéréo en un seul mp3 le fichier utilise la bibliothèque ffmpeg libmp3lame .

Commande:

ffmpeg -i "concat:'url1.mp3'|'mono_url2.mp3'|'stereo_url3.mp3'" -c:a libmp3lame output_file.mp3 


0 commentaires