Copiar video h.264 de TS a MP4 cambia la velocidad de fotogramas y el tiempo

Tengo un gran archivo MPEG-TS que estoy convirtiendo a MP4 usando el siguiente comando. Si busco el mismo tiempo en el video tanto en el archivo MP4 como en el TS, el MP4 estará unos cuadros por detrás del archivo TS. Esto empeora progresivamente cuanto más avanzo en el video que busco.

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%

Estoy confundido por qué el TBN es tan grande en el flujo de salida. Probé -copyts, -copytb, todas las opciones -vsynch, pero no puedo obtener tiempos de búsqueda para que coincidan en el MP4. Además, el MP4 muestra una velocidad de fotogramas de 29,78, mientras que el archivo TS es sólido 30/1 con 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" 

¿Alguna idea de cómo puedo hacer que la búsqueda en ambos contenedores muestre el mismo marco? ¡Por favor ayuda!

¿Qué pasa si quitas la entrada -r 30? ¿Cuál es la razón de eso de todos modos? Además, habilita el modo de copia de transmisión , lo que significa que se ignora -c:v copyla salida .-r 30
@LordNeckbeard: cambia algunas cosas en la salida, pero todavía tengo el problema de búsqueda. Consulte log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c . Gracias por explicar que -r 30 no es necesario. No entendí bien su uso, pensé que podría forzar la velocidad de fotogramas de mp4.
Según tengo entendido, mp4 no almacena una velocidad de fotogramas en ningún lado, solo tiempos entre fotogramas individuales. Por lo tanto, ffprobe observa los tiempos de fotograma de los primeros fotogramas y asume que el resto del video es el mismo. Sin embargo, no tengo ninguna idea para resolver tu problema. Excepto tal vez probar algo que no sea ffmpeg, como MP4Box. O incluso mkvmerge a un .mkv, para ver si eso funciona de manera diferente. (y tal vez intente muxing ffmpeg a algo que no sea mp4. El muxer mp4 de ffmpeg podría no ser perfecto).
La velocidad de cuadro de video estándar es 29.97, si convierte a 30 fps eventualmente verá una deriva: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
tbn del flujo de salida es demasiado pequeño 15k. debe ser 90k. Parece que descartar la transmisión de audio es la fuente del problema.
@incBrain tbnno es un problema. El tbnpara TS es fijo 90kindependientemente de la velocidad de fotogramas del flujo de video y FFmpeg genera un tbn tbr x 512para formatos MOV/MP4 donde tbres la velocidad de fotogramas del códec. El audio no tiene en cuenta aquí, ya tbnque se refiere a la escala de tiempo del video.
@Mulvya tnx por la información. ¿Sabes por qué eligieron tbr x 512? ¿Por qué 512?

Respuestas (1)

Según un comentario aquí, eliminar el indicador -r debería hacer esto correctamente. También tiene otro indicador -r para la entrada. Elimínelos a ambos, y debería copiar correctamente la transmisión tal como está en un nuevo contenedor; es posible que también deba eliminar ese interruptor (deshabilitar audio). No estoy seguro de eso:

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

Si eso falla, también según un comentario aquí, puede probar con un formato de contenedor de salida diferente.