2013-09-27 4 views
5

Je travaille sur un wrapper API libavformat qui convertit les fichiers MP4 avec H.264 et AAC en segments MPEG-TS adaptés au streaming. Je fais juste une simple copie de flux sans ré-encodage, mais les fichiers que je produis rejouent la vidéo à 3600 fps au lieu de 24 fps.Les fichiers créés avec une copie directe à l'aide de l'API libavformat de FFmpeg sont lus trop rapidement à 3600 fps

Voici quelques sorties de ffprobe https://gist.github.com/chrisballinger/6733678, le fichier brisé est ci-dessous:

r_frame_rate=1/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=0 
start_time=0.000000 
duration_ts=2999 
duration=0.033322 

Le fichier d'entrée même envoyé manuellement via ffmpeg a une bonne information d'horodatage:

r_frame_rate=24/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=126000 
start_time=1.400000 
duration_ts=449850 
duration=4.998333 

Je crois que les mensonges de problème quelque part dans ma configuration de libavformat ici: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349 où j'ai réutilisé un tas de code de ffmpeg.c qui était requis pour la copie de flux direct. Depuis 3600 semble être un "nombre magique" (60 * 60), il pourrait être aussi simple que moi de ne pas régler l'échelle de temps correctement, mais je ne peux pas comprendre où mon code diverge de ffmpeg/avconv lui-même.

question similaire ici, mais je ne pense pas qu'ils ont autant que je l'ai fait: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

Répondre

1

Il a fallu un certain temps, mais cela est la réponse: https://stackoverflow.com/a/16903982/805882

packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base); 
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base); 
2

En fait, vos pts et dts sont foiré. Le fichier MP4 a pts et dts selon la base de temps MP4 et vous passez les mêmes pts et dts au ts muxer qui fonctionne avec l'horloge 90000Hz. Par exemple, si votre fps est de 30 images par seconde, alors dans ts, cela signifie que vous affichez une image vidéo toutes les 3000 ticks.

vous devez utiliser av_rescal_q pour changer les pts de mp4 à ts timbase.

+0

Merci! Je n'étais pas tout à fait sûr de savoir comment redimensionner la base de temps correctement, mais il semble que cela pourrait m'aider à me diriger dans la bonne direction. Je vais vous laisser savoir comment ça se passe! –

Questions connexes