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

10

Tengo un gran archivo MPEG-TS que estoy convirtiendo a MP4 usando el siguiente comando. Si busco al mismo tiempo en el video tanto en el archivo MP4 como en el TS, el MP4 estará unos cuadros detrás del archivo TS. Esto empeora progresivamente a medida que 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 la secuencia de salida. Intenté -copyts, -copytb, todas las opciones de -vsynch, pero no puedo obtener tiempos de búsqueda que coincidan con el MP4. Además, el MP4 muestra una velocidad de cuadros de 29.78, mientras que el archivo TS es sólido 30/1 usando 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 obtener la búsqueda en ambos contenedores para mostrar el mismo marco? ¡Por favor ayuda!

Andy
fuente
1
¿Qué sucede si eliminas la entrada -r 30? ¿Cuál es la razón de eso de todos modos? Además, habilita el modo de copia de flujo con el -c:v copyque -r 30se ignora la salida .
llogan
@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 no se necesita el -r 30, no entendí bien su uso, pensé que podría forzar la velocidad de fotogramas mp4.
Andy
1
Según tengo entendido, mp4 no almacena una velocidad de cuadros en ningún lugar, solo veces entre cuadros individuales. Entonces ffprobe mira los tiempos de cuadro de los primeros cuadros, y asume que el resto del video es el mismo. Sin embargo, no tengo ideas para resolver su problema. Excepto tal vez intente algo diferente a ffmpeg, como MP4Box. O incluso mkvmerge a un .mkv, para ver si eso funciona de manera diferente. (y tal vez intente ffmpeg muxing a algo que no sea mp4. ffmpeg's mp4 muxer podría no ser perfecto.)
Peter Cordes
La velocidad de fotogramas de video estándar es de 29.97, si convierte a 30 fps eventualmente verá deriva: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
ejercicios de gritos
tbn del flujo de salida es demasiado pequeño 15k debería ser 90k. Parece que el descarte del flujo de audio es la fuente del problema.
Dimitri Podborski el

Respuestas:

3

Según un comentario aquí, eliminar la bandera -r debería hacer esto correctamente. También tiene otro indicador -r para la entrada. Elimine ambos, y debería copiar correctamente la secuencia tal como está en un nuevo contenedor; es posible que también necesite eliminar ese interruptor -an (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 un formato de contenedor de salida diferente.

r_alex_hall
fuente