Copiar vídeo h.264 de TS para MP4 altera a taxa de quadros e o tempo

10

Eu tenho um arquivo MPEG-TS grande que estou convertendo para MP4 usando o comando abaixo. Se eu procurar ao mesmo tempo no vídeo nos arquivos MP4 e TS, o MP4 ficará alguns quadros atrás do arquivo TS. Isso piora progressivamente quanto mais eu busco no vídeo.

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%

Estou confuso por que o TBN é tão grande no fluxo de saída. Eu tentei -copyts, -copytb, todas as opções -vsynch, mas não consigo obter tempos de busca correspondentes ao MP4. Além disso, o MP4 mostra uma taxa de quadros de 29,78, enquanto o arquivo TS é 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" 

Alguma idéia de como posso obter a procura nos dois contêineres para mostrar o mesmo quadro? Por favor ajude!

Andy
fonte
11
O que acontece se você remover a entrada -r 30? Qual é a razão disso, afinal? Além disso, você ativa o modo de cópia de fluxo com o -c:v copyque significa que a saída -r 30é ignorada.
Llogan
@ LordNeckbeard - muda algumas coisas na saída, mas ainda tenho o problema de busca. Veja log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c . Obrigado por explicar que o -r 30 não é necessário.
Andy
11
Pelo que entendi, o mp4 não armazena uma taxa de quadros em nenhum lugar, apenas momentos entre quadros individuais. Portanto, o ffprobe analisa os tempos de quadro dos primeiros quadros e assume que o restante do vídeo é o mesmo. No entanto, não tenho nenhuma idéia para resolver seu problema. Exceto, talvez, tentar algo diferente do ffmpeg, como o MP4Box. Ou até mkvmerge para um .mkv, para ver se isso funciona de maneira diferente. (e talvez tentar ffmpeg muxing para algo diferente de mp4 de ffmpeg muxer mp4 pode não ser perfeito..)
Peter Cordes
A taxa de quadros de vídeo padrão é 29,97; se você converter para 30fps, verá a deriva: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
screaming drills
tbn do fluxo de saída é muito pequeno 15k. deve ser 90k. Parece que o descarte do fluxo de áudio é a fonte do problema.
precisa saber é o seguinte

Respostas:

3

De acordo com um comentário aqui, a remoção do sinalizador -r deve fazer isso corretamente. Você tem outro sinalizador -r para a entrada também. Remova os dois e ele deve copiar corretamente o fluxo como está em um novo contêiner; pode ser necessário remover também a opção -an (desativar áudio). Não tenho certeza disso:

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

Se isso falhar, também por um comentário aqui, você pode tentar um formato de contêiner de saída diferente.

r_alex_hall
fonte