De acordo com o valor MOV_TIMESCALE em libavformat / movenc.h, isso é difícil de definir para 1000. Não tenho certeza porque isso foi escolhido como realmente não é um valor bom / útil.
Eu enviei um patch para mudar isso para 600.
Quando eu executo meus arquivos em Quicktime mov 24fps através de um transcode FFmpeg eles estão saindo com uma escala de tempo de 1000, quando o arquivo de origem tem uma escala de tempo de 24000. Este valor de escala de tempo baixa está causando problemas em algumas ferramentas de software profissionais procurando o arquivo.
No meu caso, o arquivo de origem é um Quicktime com 1 x trilha de vídeo (DNx115) e 1 x trilha de dados (Timecode). Estou transcodificando-o para DNx36.
Eu posso forçar a escala de tempo do vídeo para 24000 adicionando "-video_track_timescale 24000", mas isso não afeta nada além da faixa de vídeo.
O comando é o seguinte:
ffmpeg -i input.mov -c:v dnxhd -b:v 36M -pix_fmt yuv422p -video_track_timescale 24000 output.mov
Saída do console sem cortes:
ffmpeg version N-90214-gdd3f1e3a11-tessus Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 56. 8.100 / 56. 8.100
libavcodec 58. 13.102 / 58. 13.102
libavformat 58. 10.100 / 58. 10.100
libavdevice 58. 2.100 / 58. 2.100
libavfilter 7. 12.100 / 7. 12.100
libswscale 5. 0.102 / 5. 0.102
libswresample 3. 0.101 / 3. 0.101
libpostproc 55. 0.100 / 55. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2018-03-06T10:45:16.000000Z
timecode : 01:14:25:22
Duration: 00:00:30.00, start: 0.000000, bitrate: 116392 kb/s
Stream #0:0(eng): Video: dnxhd (DNXHD) (AVdn / 0x6E645641), yuv422p(tv, bt709), 1920x1080, 116391 kb/s, SAR 1:1 DAR 16:9, 24 fps, 24 tbr, 24k tbn, 24k tbc (default)
Metadata:
creation_time : 2018-03-06T10:45:16.000000Z
handler_name : Apple Alias Data Handler
encoder : Avid DNxHD Codec
Stream #0:1(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
Metadata:
creation_time : 2018-03-06T10:45:20.000000Z
handler_name : Apple Alias Data Handler
timecode : 01:14:25:22
Stream mapping:
Stream #0:0 -> #0:0 (dnxhd (native) -> dnxhd (native))
Press [q] to stop, [?] for help
Output #0, mov, to 'output.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
timecode : 01:14:25:22
encoder : Lavf58.10.100
Stream #0:0(eng): Video: dnxhd (DNXHD) (AVdn / 0x6E645641), yuv422p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-1024, 36000 kb/s, 0.04 fps, 24k tbn, 24 tbc (default)
Metadata:
creation_time : 2018-03-06T10:45:16.000000Z
handler_name : Apple Alias Data Handler
encoder : Lavc58.13.102 dnxhd
frame= 720 fps=151 q=4.0 Lsize= 132482kB time=00:00:29.95 bitrate=36226.7kbits/s speed=6.28x
Eu verifiquei o valor da escala de tempo no Atom Inspector e posso ver claramente que o mvhd (Movie Header) foi alterado para 1000 no output.mov quando o input.mov foi definido como 24000.
1000 não é divisível por 24, então resulta em busca imprecisa.
Usando o Atom Inspector para alterar manualmente a escala de tempo do cabeçalho para 24000 e alterar os campos de duração para o que eles devem basear nessa escala de tempo, o arquivo funciona como esperado.
Existe alguma maneira de definir o valor da escala de tempo do Movie Header como uma opção no FFmpeg?
De acordo com o valor MOV_TIMESCALE em libavformat / movenc.h, isso é difícil de definir para 1000. Não tenho certeza porque isso foi escolhido como realmente não é um valor bom / útil.
Eu enviei um patch para mudar isso para 600.