Par exemple: J'ai fichier.mp3, je sais que mon format désiré peut lire le son sans vidéo (par exemple FLV) donc comment mettre les données mp3 encodées en utilisant ffmpeg du conteneur mp3 dans flv (où obtenir des articles/code échantillons sur ce)? Je ne veux pas dire de cmd mais de C++ en utilisant ffmpeg comme bibliothèque. (voir les étiquettes)FFmpeg: Comment mettre des données média encodées d'un conteneur à un autre sans recodage?
Répondre
Voici la commande pour convertir le fichier .mp3 en .flv (qui n'a aucune donnée vidéo).
ffmpeg -i test.mp3 -ab 32k -acodec libmp3lame -ac 1 -ar 44100 audio.flv.
Vous pouvez exécuter cette commande depuis votre programme.
Si vous avez besoin d'aide sur la façon d'installer et d'utiliser ffmpeg vous pouvez aller sur leur site:
Merci,
Mahmud
Avez-vous envisagé juste en cours d'exécution ffmpeg à partir d'un appel popen()/system() à partir de C++? C'est beaucoup plus facile que de configurer la bibliothèque ffmpeg, cela rend trivial à multithread (pas vraiment un problème dans l'exemple) et vous libère de tout problème de liaison LGPL et dll-hell.
J'apprécie vraiment l'idée, mais ce n'est pas mon genre - parce que je prévois de travailler en temps réel avec mes flux de programmes vidéo et mes flux vidéo en direct sur Internet ... – Rella
Vous pouvez diriger les données de votre programme vers ffmpeg avec popen() –
Voici ce que vous voulez faire:
AVFormatContext *ptrFormatContext;
int i, videoStream, audioStream;
AVCodecContext *ptrCodecCtxt;
AVCodec *ptrCodec;
AVFrame *ptrFrame;
AVPacket ptrPacket;
int frameFinished;
float aspect_ratio;
AVCodecContext *aCodecCtx;
AVCodec *aCodec;
AVCodecContext *aTargetCodecCtxt;
AVCodecContext *vTargetCodecCtxt;
AVCodec *aTargetCodec;
AVCodec *vTargetCodec;
AVSampleFormat ptrSampleFormats[2] = {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32};
audioStream = videoStream = -1;
av_register_all();
avcodec_register_all();
ptrFormatContext = avformat_alloc_context();
if(avformat_open_input(&ptrFormatContext, filename, NULL, NULL) != 0)
{
qDebug("Error opening the input");
exit(-1);
}
if(av_find_stream_info(ptrFormatContext) < 0)
{
qDebug("Could not find any stream info");
exit(-2);
}
dump_format(ptrFormatContext, 0, filename, (int) NULL);
for(i=0; i<ptrFormatContext->nb_streams; i++)
{
switch(ptrFormatContext->streams[i]->codec->codec_type)
{
case AVMEDIA_TYPE_VIDEO:
{
if(videoStream < 0) videoStream = i;
break;
}
case AVMEDIA_TYPE_AUDIO:
{
if(audioStream < 0) audioStream = i;
}
}
}
if(audioStream == -1)
{
qDebug("Could not find any audio stream");
exit(-3);
}
if(videoStream == -1)
{
qDebug("Could not find any video stream");
exit(-4);
}
aCodecCtx = ptrFormatContext->streams[audioStream]->codec;
if((aCodec = avcodec_find_decoder(aCodecCtx->codec_id)) == NULL)
{
qDebug("Could not find the audio decoder");
exit(-5);
}
if((avcodec_open(aCodecCtx, aCodec)) != 0)
{
qDebug("Could not open the audio decoder");
exit(-6);
}
ptrCodecCtxt = ptrFormatContext->streams[videoStream]->codec;
if((ptrCodec = avcodec_find_decoder(ptrCodecCtxt->codec_id)) == NULL)
{
qDebug("Could not find the video decoder");
exit(-7);
}
if((avcodec_open(ptrCodecCtxt, ptrCodec)) != 0)
{
qDebug("Could not find any video stream");
exit(-8);
}
Puis d'autres choses, plus d'importance si vous ne voulez pas réencoder ...
ptrFrame = avcodec_alloc_frame();
while(av_read_frame(ptrFormatContext,&ptrPacket) >= 0)
{
if(ptrPacket.stream_index == videoStream)
{
//do stuff with the package, for eg transcribe it into another output stream..
}
else if (ptrPacket.stream_index == audioStream)
{
//do stuff with the package, for eg transcribe it into another output stream..
}
}
qui est utile espoir. Le code n'est cependant qu'un extrait et ne fonctionnera pas tout seul, mais cela vous aidera à avoir l'idée.
- 1. PHP cURL obtenir des données encodées
- 2. partitionnement de table sans application de recodage?
- 3. problème de données d'image encodées
- 4. Comment puis-je lier un conteneur existant à un autre?
- 5. Comment parcourir à travers un conteneur dans une autre classe?
- 6. comment appeler un service Web à partir d'un conteneur dans un autre conteneur dans glassfish
- 7. Accès à un EJB distant s'exécutant dans un autre Glassfish (conteneur EJB) à partir d'un autre Glassfish (conteneur Web)
- 8. Comment mettre à jour des objets entité sans les supprimer?
- 9. Comment mettre à jour l'objet sans hypothèses, les données
- 10. Comment mettre à jour un champ avec des données aléatoires?
- 11. Mettre fin à un workflow sans propriétaire
- 12. comment lier ffmpeg à php.ini
- 13. Comment ajouter des images wiki média sémantiques
- 14. comment mettre à jour un enregistrement sélectionné dans un ensemble de données et mettre à jour une autre donnée dans un autre Adoconnection?
- 15. Comment copier des données binaires d'un flux à un autre?
- 16. Ajout d'une ligne au recodage numpy
- 17. Impossible de mettre des données à la première ligne dans le terminal sans un éditeur?
- 18. Polylignes encodées à l'aide de JQuery
- 19. jpa sans conteneur
- 20. Comment mettre à jour des attributs sans validation
- 21. Comment migrer des données d'un produit à un autre sans révéler la structure de la base de données?
- 22. Mise à jour des données sans récupération
- 23. ffmpeg vfilters à des timecodes spécifiques
- 24. Comment mettre une légende en flv converti par ffmpeg
- 25. Fichiers Flash et média (son) sans serveur multimédia
- 26. Comment mettre un attribut de codage à xml autre que utf-16 avec XmlWriter?
- 27. JNDI sans conteneur J2EE (avec JNP? Peut-être un autre fournisseur?)
- 28. Calculer la taille maximale pour les données encodées
- 29. Android - Passer des données de BroadcastReciever à un autre objet?
- 30. Comment joindre un composant à un autre conteneur lors de l'exécution?
Pas de cmd mais de C++, s'il vous plaît. Et btw il semble réencoder si utilisé dans votre chemin ... – Rella
Vous trouverez un exemple de programme dans le répertoire ffmpeg nommé ffmpeg.c si vous l'installez. Dans la fonction principale, ajoutez les codes suivants à la fin: opt_input_file ("in.mp3"); opt_audio_codec ("libmp3lame"); opt_audio_rate (NULL, "44100"); opt_audio_channels (NULL, "1"); opt_default ("ab", "32k"); opt_default ("ac", "1"); opt_output_file ("out.flv"); if (nb_output_files <= 0) { \t fprintf (erreur stderr, "erreur"); \t return -1; } if (nb_input_files == 0) { \t fprintf (erreur stderr, "erreur"); \t return -1; Av_encode (output_files, nb_output_files, input_files, nb_input_files, stream_maps, nb_stream_maps); –
mais il semble que vous réencodiez - pas simplement mettre des paquets codés dans un autre conteiner ... – Rella