La copia di video h.264 da TS in MP4 modifica la frequenza dei fotogrammi e il tempo


10

Ho un grande file MPEG-TS che sto convertendo in MP4 usando il comando seguente. Se cerco contemporaneamente nel video sia nel file MP4 che nel file TS, l'MP4 avrà qualche frame dietro il file TS. Questo peggiora progressivamente più nel video che cerco.

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%

Sono confuso perché il TBN è così grande nel flusso di output. Ho provato -copyts, -copytb, tutte le opzioni -vsynch, ma non riesco a ottenere i tempi di ricerca per abbinare su MP4. Inoltre, l'MP4 mostra un frame rate di 29,78, mentre il file TS è solido 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" 

Hai idea di come posso ottenere la ricerca su entrambi i contenitori per mostrare lo stesso frame? Per favore aiuto!


1
Cosa succede se si rimuove l'input -r 30? Qual è la ragione comunque? Inoltre, si abilita la modalità di copia stream con la -c:v copyquale significa che l'output -r 30viene ignorato.
llogan,

@LordNeckbeard - cambia alcune cose nell'output, ma ho ancora il problema di ricerca. Vedi log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c , Grazie per aver spiegato che -r 30 non è necessario, ho frainteso il suo utilizzo, ho pensato di poter forzare il frame rate mp4.
Andy,

1
A quanto ho capito, mp4 non memorizza un framerate da nessuna parte, solo volte tra i singoli frame. Quindi ffprobe osserva i tempi dei fotogrammi dei primi pochi fotogrammi e presuppone che il resto del video sia lo stesso. Tuttavia, non ho idee per risolvere il tuo problema. Tranne forse provare qualcosa di diverso da ffmpeg, come MP4Box. O anche mkvmerge in un .mkv, per vedere se funziona diversamente. (e forse provare a fondere ffmpeg con qualcosa di diverso da mp4. Il muxer mp4 di ffmpeg potrebbe non essere perfetto.)
Peter Cordes,

La frequenza dei fotogrammi video standard è 29,97, se si converte in 30 fps alla fine si vedrà la deriva: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
urla di trapani

tbn del flusso di output è troppo piccolo 15k. dovrebbe essere 90k. Sembra che scartare il flusso audio sia la fonte del problema.
Dimitri Podborski,

Risposte:


3

Come da un commento qui, rimuovere la bandiera -r dovrebbe farlo correttamente. Hai anche un altro flag -r per l'input. Rimuovere entrambi e dovrebbe copiare correttamente il flusso così com'è in un nuovo contenitore; potrebbe essere necessario rimuovere anche l'opzione -an (disabilita audio). Non ne sono sicuro:

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

In caso contrario, anche per un commento qui, è possibile provare un diverso formato del contenitore di output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.