La copie de vidéos h.264 de TS en MP4 modifie la fréquence d'images et le temps

10

J'ai un gros fichier MPEG-TS que je convertis en MP4 en utilisant la commande ci-dessous. Si je cherche en même temps dans la vidéo à la fois dans le fichier MP4 et TS, le MP4 sera quelques images derrière le fichier TS. Cela empire progressivement au fur et à mesure que je cherche la vidéo.

c:\>ffmpeg -y -r 30 -i full-ts.ts -c:v copy -r 30 -an full.mp4
ffmpeg version N-69040-gb23a866 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 12 2015 22:02:37 with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-
libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.101 / 56. 18.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5.  7.100 /  5.  7.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mpegts, from 'full-ts.ts':
  Duration: 00:11:25.75, start: 1.424000, bitrate: 3407 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 125 kb/s
Output #0, mp4, to 'full.mp4':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 30 tbr, 15360 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=20419 fps=0.0 q=-1.0 Lsize=  251660kB time=00:11:25.59 bitrate=3007.0kbits/s
video:251446kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.084929%

Je ne comprends pas pourquoi le TBN est si grand dans le flux de sortie. J'ai essayé -copyts, -copytb, toutes les options -vsynch, mais je ne peux pas obtenir de temps de recherche pour correspondre sur le MP4. En outre, le MP4 affiche une fréquence d'images de 29,78, tandis que le fichier TS est solide 30/1 en utilisant ffprobe.

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full.mp4
streams_stream_0_avg_frame_rate="5227264/175529"

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full-ts.ts
programs_program_0_streams_stream_0_avg_frame_rate="30/1"
streams_stream_0_avg_frame_rate="30/1" 

Une idée comment je peux obtenir la recherche sur les deux conteneurs pour afficher le même cadre? Aidez-moi!

Andy
la source
1
Que se passe-t-il si vous supprimez l'entrée -r 30? Quelle est la raison de cela de toute façon? En outre, vous activez le mode de copie de flux avec -c:v copylequel la sortie -r 30est ignorée.
llogan
@LordNeckbeard - cela change quelques choses dans la sortie, mais j'ai toujours le problème de recherche. Voir log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c , Merci d'avoir expliqué que le -r 30 n'est pas nécessaire, j'ai mal compris son utilisation, pensais que je pourrais forcer la fréquence d'images mp4.
Andy
1
Si je comprends bien, mp4 ne stocke aucun framerate n'importe où, juste des temps entre les images individuelles. Ainsi, ffprobe examine les temps de trame des premières images et suppose que le reste de la vidéo est le même. Je n'ai cependant aucune idée pour résoudre votre problème. Sauf peut-être essayer autre chose que ffmpeg, comme MP4Box. Ou même mkvmerge à un .mkv, pour voir si cela fonctionne différemment. (et peut-être essayez de ffmpeg muxer vers autre chose que mp4. Le muxer mp4 de ffmpeg n'est peut-être pas parfait.)
Peter Cordes
Le taux de trame vidéo standard est de 29,97, si vous convertissez à 30 images par seconde,
Screaming
tbn du flux de sortie est trop petit 15k. il devrait être de 90k. Il semble que la suppression du flux audio soit à l'origine du problème.
Dimitri Podborski

Réponses:

3

Selon un commentaire ici, la suppression de l'indicateur -r devrait le faire correctement. Vous avez également un autre indicateur -r pour l'entrée. Supprimez les deux, et il devrait copier correctement le flux tel qu'il est dans un nouveau conteneur; vous devrez peut-être également supprimer ce commutateur -un (désactiver l'audio). Je ne suis pas sûr à ce sujet:

ffmpeg -y -i full-ts.ts -c:v copy full.mp4

Si cela échoue, également par un commentaire ici, vous pouvez essayer un autre format de conteneur de sortie.

r_alex_hall
la source