2013-06-11 3 views
0

J'ai écrit du code C qui prend un fichier mp4 avec de la vidéo codée h264 et de l'audio codé AAC et l'écrit dans des fichiers .ts segmentés.Conversion de mp4 en crash de mpeg2-ts sur des paquets audio

Le code peut être vu ici: http://pastebin.com/JVdgjM9G

Le problème est que le code selfs sur les paquets audio. Parce que je suis en train de convertir à partir de h264, je dois utiliser le "h264_mp4toannexb" que j'ai finalement travaillé pour les images vidéo. Cependant, dès que le programme atteint le premier paquet audio (flux 1 ci-dessous), il se bloque.

Exemple de sortie:

Output #0, mpegts, to 'testvideo': 
    Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 1416 kb/s, 90k tbn, 23.98 tbc 
    Stream #0.1: Audio: libfaac, 48000 Hz, stereo, 127 kb/s 
First chunk: testvideo-00001.ts 
Read frame, keyframe: 1, index: 0 
Did bitfilter fun! 
Read frame, keyframe: 0, index: 0 
Did bitfilter fun! 
(...this repeats several more times, truncated for space...) 
Did bitfilter fun! 
Read frame, keyframe: 0, index: 0 
Did bitfilter fun! 
Read frame, keyframe: 1, index: 1 
base(54516) malloc: *** error for object 0x7fd2db404520: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

J'ai essayé de changer le code à exécuter également le filtre sur le flux audio (en utilisant audio_stream->codec au lieu de video_stream->codec), mais qui donne tout simplement une erreur du filtre.

Le problème se produit lorsque j'essaie d'appeler av_interleaved_write_frame(output_context, &packet); - pour les paquets vidéo filtrés, il n'y a pas de problème mais le paquet audio est complètement bloqué. Je suis un peu perplexe sur pourquoi, si toute aide est appréciée.

+0

L'erreur se produit donc à la ligne 297? Qu'est-ce que l'objet 0x7fd2db404520? – idoby

+0

C'est l'objet paquet, pour autant que je sache. J'ai essayé de le déboguer, mais je suis entré dans quelque chose où il n'y avait pas de symboles (trou noir) et je n'ai pas pu le suivre. Mais le paquet est la seule chose qui change entre chaque itération pour cette fonction, donc je ne peux pas imaginer que ce soit autre chose. –

+0

Ceci est beaucoup de code à déboguer par le globe oculaire. Pouvez-vous publier ce projet en tant que projet constructible, y compris les bibliothèques, afin que les utilisateurs puissent le coller dans une machine virtuelle, le créer et le déboguer? – idoby

Répondre

0

Il s'avère que l'appel av_free_packet après que la manipulation de bitfilter était en train de libérer les paquets vidéo. La suppression de cet appel a provoqué l'exécution correcte du code!

Questions connexes