IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Audio Discussion :

Libavcodec audio4 pas de son


Sujet :

Audio

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Libavcodec audio4 pas de son
    Bonjour à tous,

    J'ai migré récemment une application (en c) qui affiche des vignettes vidéos, elle ne tournait qu'avec d'anciennes versions de la libavcodec.
    Je n'ai pas d'erreur à la compilation et les vidéos fonctionnent bien
    Seulement voila je n'ai pas de son

    Si quelqu'un à une idée ...

    Avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    int video_decode_audio_frame( AVCodecContext *context, uint8_t *buffer, int buffer_size ) {
    	static AVPacket packet;
    	int used, data_size;
    	for(;;) {
    		while( audio_packet.size > 0 ) {
    			data_size = buffer_size;
    			// Todo depreciated //
    			used = avcodec_decode_audio3( context, (int16_t *)audio_buffer, &data_size,
    				&audio_packet);
    			if( used < 0 ) {
    				/* if error, skip frame */
    				audio_packet.size = 0;
    				break;
    			}
    			audio_packet.data += used;
    			audio_packet.size -= used;
     
    			if( data_size <= 0 ) {
    				/* No data yet, get more frames */
    				continue;
    			}
     
    			audio_clock += (double)data_size /
    				(double)(format_context->streams[audio_stream]->codec->sample_rate *
    				(2 * format_context->streams[audio_stream]->codec->channels));
    			/* We have data, return it and come back for more later */
    			return data_size;
    		}
    		if( packet.data )
    			av_free_packet( &packet );
     
    		if( stop ) {
    			audio_running = 0;
    			return -1;
    		}
     
    		if( packet_queue_get( &audio_queue, &packet, 1 ) < 0 )
    			return -1;
     
    		audio_packet.data = packet.data;
    		audio_packet.size = packet.size;
     
    		if( packet.pts != AV_NOPTS_VALUE ) {
    			audio_clock = packet.pts * av_q2d( format_context->streams[audio_stream]->time_base );
    		}
    	}
    }
    Après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    	for(;;) {
    		while (audio_packet.size > 0) {
    		int got_frame = 0;
    		data_size = buffer_size;
    		used = avcodec_decode_audio4( context, frame, &got_frame,  &packet);
    		if( used < 0 ) {
    			/* if error, skip frame */
    			audio_packet.size = 0;
    			break;
    		}
    		audio_packet.data += used;
    		audio_packet.size -= used;
     
     
    		 if (got_frame) {
    		/* if a frame has been decoded, output it */
    			data_size = av_samples_get_buffer_size(NULL, context->channels,frame->nb_samples,context->sample_fmt, 1);
    			if( data_size < 0 ) {
     				/* This should not occur, checking just for paranoia */
    				fprintf(stderr, "Failed to calculate data size\n");
    				exit(1);
    			}	
    		}
    			fprintf(stderr, "data_size %d\n", data_size);
    			return data_size;
    		}
     
     
     
    		if( packet.data )
    			av_free_packet( &packet );
     
    		if( stop ) {
    			audio_running = 0;
    			return -1;
    		}
     
    		if( packet_queue_get( &audio_queue, &packet, 1 ) < 0 )
    			return -1;
     
    		audio_packet.data = packet.data;
    		audio_packet.size = packet.size;
     
    		if( packet.pts != AV_NOPTS_VALUE ) {
    			audio_clock = packet.pts * av_q2d( format_context->streams[audio_stream]->time_base );
    		}
    	}

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    N'avez pas un soucis avec vos variables audio_packet et packet ?
    Je trouve que vous faites de multiples choses (que je n'arrive pas spécialement à saisir), alors que le code d'exemple me semble un tantinet plus simple : https://www.ffmpeg.org/doxygen/trunk...ce.html#l00242
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Bonjour Littlewhite

    Il s'agit du même programme que la dernière fois, il y a quelques paramètres en plus comme (stop) mais ils servent à autre chose (en l’occurrence quitter la lecture), sans ou avec j'ai le même résultat.
    Tu as le contexte complet ici ligne 170 https://github.com/fredbcode/cabrio/blob/master/video.c , la partit LIBAVCODEC_VERSION_MAJOR <= 53 fonctionne parfaitement, j'ai essayé d'ajouter LIBAVCODEC54 en suivant les exemples, mais au mieux je n'ai pas de son, j'avoue ne pas bien comprendre le fonctionnement ...

    Je me demande si le problème ne vient pas de la partie fread manquante, mais je ne le retrouve pas dans tous les exemples sur le net ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     319  avpkt.dts =
    320  avpkt.pts = AV_NOPTS_VALUE;
    321  if (avpkt.size < AUDIO_REFILL_THRESH) {
    322  /* Refill the input buffer, to avoid trying to decode
    323  * incomplete frames. Instead of this, one could also use
    324  * a parser, or use a proper container format through
    325  * libavformat. */
    326  memmove(inbuf, avpkt.data, avpkt.size);
    327  avpkt.data = inbuf;
    328  len = fread(avpkt.data + avpkt.size, 1,
    329  AUDIO_INBUF_SIZE - avpkt.size, f);
    Dans ce cas il faudrait peut-être que je récupére nom du fichier (dans l'exemple f) mais il n'est utilisé comme argument que dans video_open(), je dois créer une nouvelle variable globale ?

Discussions similaires

  1. [PB ODBC] Ce serveur n'existe pas ou son accès est refusé
    Par meufeu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/12/2015, 18h02
  2. Pas de son sur enceintes intégrées
    Par rod59 dans le forum Matériel
    Réponses: 11
    Dernier message: 09/01/2006, 12h11
  3. [FLASH 8] Pas de son
    Par i_shinji dans le forum Flash
    Réponses: 2
    Dernier message: 13/12/2005, 00h09
  4. ShellExecute qui veut pas faire son boulot...
    Par giloutho dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 31/08/2005, 11h49
  5. [J2ME]pas de son
    Par Arkan dans le forum Java ME
    Réponses: 2
    Dernier message: 04/04/2005, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo