Comment faire pour convertir la fréquence d'échantillonnage de AV_SAMPLE_FMT_FLTP à AV_SAMPLE_FMT_S16?
Je suis décodage aac, pcm avec ffmpeg avec avcodec_decode_audio3. Cependant, il décode en AV_SAMPLE_FMT_FLTP exemple de format PCM (32 bits Float Planaire) et j'ai besoin de AV_SAMPLE_FMT_S16 (PCM 16 bits signé - S16LE).
Je sais que ffmpeg pouvez le faire facilement avec -sample_fmt. Je veux faire la même chose avec le code, mais je ne pouvais toujours pas le comprendre.
audio_resample n'a pas fonctionné: il échoue avec le message d'erreur: .... échec de la conversion.
Avez-vous déjà fait la réponse à cette question? Suis confronté exactement le même problème
OriginalL'auteur frankish | 2013-02-20
Vous devez vous connecter pour publier un commentaire.
MODIFIER 9 avril 2013: Travaillé sur la façon d'utiliser libswresample pour ce faire... beaucoup plus rapide!
À un certain point dans les 2-3 dernières années FFmpeg AAC décodeur format de sortie du changé de AV_SAMPLE_FMT_S16 à AV_SAMPLE_FMT_FLTP. Cela signifie que chaque canal audio dispose de sa propre mémoire tampon, et chaque valeur de l'échantillon est un 32 bits à virgule flottante valeur de l'échelle de -1.0 à +1.0.
Alors qu'avec AV_SAMPLE_FMT_S16 les données dans un tampon unique, les échantillons sont entrelacées, et chaque échantillon est un nombre entier signé de -32767 à +32767.
Et si vous avez vraiment besoin de votre audio comme AV_SAMPLE_FMT_S16, alors vous devez faire la conversion vous-même. J'ai trouvé deux façons de le faire:
1. Utilisation libswresample (recommandé)
Et c'est tout ce que vous avez à faire!
2. Le faire à la main en C (réponse originale à cette question, n'est pas recommandé)
Dans votre décoder boucle, lorsque vous avez un paquet audio vous le décoder comme ceci:
Et puis, si vous avez une image complète de l'audio, vous pouvez convertir assez facilement:
J'ai laissé un couple de choses pour plus de clarté... le serrage dans le mono chemin d'accès doit idéalement être dupliqué dans le stéréo chemin. Et le code peut être facilement optimisé.
Ruben, vous n'auriez pas ce code? J'essaie de faire ce travail de conversion, mais je vais avoir quelques problèmes. Je voudrais voir la solution de travail si vous pouviez poster un lien. Merci à l'avance.
Je n'ai plus le code pour l'option 2... à l'aide de libswresample est la seule façon saine de résoudre ce problème. Quelles sont les questions que vous avez?
En utilisant le code que vous avez posté ci-dessus pour l'option #1 "swr_init(swr);" échoue avec un -1 code de retour à l'aide de FFmpeg 2.1. Avez-vous cette rencontre?
Non, je n'ai pas l'obtenir. Essayez d'utiliser la branche 1.2 de FFmpeg au lieu de cela, cos c'est ce que j'ai utilisé. Si ce n'est pas une option, puis regardez à la mise en œuvre de swr_init() dans swresample.c... vous verrez, il enregistre beaucoup d'erreur info (qui aurait va vers stderr par défaut).
OriginalL'auteur Reuben Scratton
J'ai trouvé 2 resample fonction de FFMPEG. La performance peut-être mieux.
http://libav.org/doxygen/master/group__lavr.html
OriginalL'auteur Albert Liao
Merci Ruben pour une solution à cela. J'ai trouvé que certaines des valeurs de l'échantillon ont été légèrement décalé par rapport à une droite ffmpeg -i fichier.wav. Il semble que dans la conversion, ils utilisent un round() sur la valeur.
Pour faire la conversion, j'ai fait ce que vous avez fait avec une offre de modification de travailler pour n'importe quel nombre de canaux:
Je suis passé de la version 0.11.1 -> 1.1.3 et trouvé le changement de format de l'échantillon ennuyeux. J'ai regardé le réglage de la request_sample_fmt à AV_SAMPLE_FMT_S16 mais il semble que le aac décodeur ne supporte pas autre chose que AV_SAMPLE_FMT_FLTP de toute façon.
J'ai mis à jour ma réponse avec une meilleure manière à l'aide de libswresample. Il est étonnamment facile à faire.
Comment pouvons-nous faire le contraire de ce que c'est? Auriez-vous l'esprit de prendre un coup d'oeil à stackoverflow.com/questions/18131389/... ?
OriginalL'auteur Brad Mitchell