Quando executo ffprobe input.m2v
, fps
é relatado como 25
mesmo quando a taxa de quadros do fluxo de vídeo é conhecida por ter uma taxa de quadros (constante) de, por exemplo, 24000/1001 fps:
Input #0, mpegvideo, from 'test.m2v':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mpeg2video (mpeg1video) (Main), yuv420p(tv, progressive), 720x480 [SAR 8:9 DAR 4:3], 25 fps, 23.98 tbr, 1200k tbn
Side data:
cpb: bitrate max/min/avg: 8600000/0/0 buffer size: 1835008 vbv_delay: N/A
(Observe que a taxa de quadros correta é indicada pelo tbr
.)
Isso resulta no fps
uso errado pelo muxer de escolha também. Por exemplo:
Input #0, matroska,webm, from 'output.mkv':
Metadata:
ENCODER : Lavf61.1.100
Duration: 00:23:22.32, start: 0.042000, bitrate: 7965 kb/s
Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, progressive), 720x480 [SAR 8:9 DAR 4:3], 25 fps, 25 tbr, 1k tbn
Metadata:
DURATION : 00:23:22.318000000
Side data:
cpb: bitrate max/min/avg: 8600000/0/0 buffer size: 1835008 vbv_delay: N/A
Como faço para que o desmultiplexador para vídeo MPEG-2 bruto seja definido fps
corretamente neste caso, ou seja, fps
que tenha o mesmo valor que tbr
?
Graças a essa resposta , descobri o que
fps
se refereAVStream.avg_frame_rate
no código-fonte.Então percebo que o desmultiplexador de vídeo MPEG bruto (que é usado para vídeo MPEG-1 e MPEG-2 bruto) é criado com código comum compartilhado por um grupo de desmultiplexadores brutos: [1] [2] [3]
Os desmultiplexadores de vídeo bruto têm uma
framerate
opção comum, que tem um valor padrão de25
, eAVStream.avg_frame_rate
seria definida como o valor da opção porff_raw_video_read_header()
: [4] [5]Portanto,
-framerate 24000/1001
pode ser usado para permitir que o muxer herde umfps
/ corretoAVStream.avg_frame_rate
. Note que a opção deve ser colocada antes-i input.m2v
(mas depois de outro-i file
, se houver) para que seja usada como uma opção demuxer para aquele arquivo de entrada em particular. Por exemplo:PS
AVStream.avg_frame_rate
, se não definido (ou seja,0/0
), seria definido comoAVStream.r_frame_rate
(tbr
), se isso for definido, em um determinado ponto . No entanto, aparentemente-framerate 0(/0)
não é aceitável mesmo quando omin
doAVOption
é0
. Meu palpite é que o código de análise de opções proíbe0(/0)
quando o tipo de opção éAV_OPT_TYPE_VIDEO_RATE
. E a razão pela qualff_raw_video_read_header()
tem que ser definidoAVStream.avg_frame_rate
é provavelmente porque nem todo fluxo/arquivo de vídeo bruto carrega metadados de taxa de quadros (que aparentemente são usados para definirAVStream.r_frame_rate
) como o vídeo MPEG-1/2 bruto faz, e que a função/método é chamado antes deAVStream.r_frame_rate
ser definido.