Почему в мой mp4-контейнер не записывается dts pts? - PullRequest
0 голосов
/ 13 мая 2019

Основываясь на моем (отвечающем на себя) вопросе здесь Смешивание AVPackets в файл mp4 - пересмотрено , я должен спросить, в чем может быть причина, почему в результирующих значениях не было написано значений для pts / dts контейнер mp4.

Я исследовал файл контейнера с помощью инструмента MediaInfo. Я заметил, что только самый первый Frame содержит значение для pts в контейнере. После этого pts даже не отображается в файле mp4, а dts со значением всех нулей.

Это вывод MediaInfo для первых 3 кадров:

0000A2   slice_layer_without_partitioning (IDR) - 0 (0x0) - Frame 0 - slice_type I - frame_num 0 - DTS 00:00:00.000 - PTS 00:00:00.017 (141867 bytes)
0000A2    Header (5 bytes)
0000A2     zero_byte:                          0 (0x00)
0000A3     start_code_prefix_one_3bytes:       1 (0x000001)
0000A6     nal_ref_idc:                        3 (0x3) - (2 bits)
0000A6     nal_unit_type:                      5 (0x05) - (5 bits)
0000A7    slice_header (3 bytes)
0000A7     first_mb_in_slice:                  0 (0x0)
0000A7     slice_type:                         7 (0x07) - I
0000A8     pic_parameter_set_id:               0 (0x0)
0000A8     frame_num:                          0 (0x0)
0000A8     idr_pic_id:                         0 (0x0)
0000A8     no_output_of_prior_pics_flag:       No
0000A8     long_term_reference_flag:           No
0000A9     slice_qp_delta:                     -5 (0xFFFFFFFB)
0000AA     disable_deblocking_filter_idc:      0 (0x0)
0000AA     slice_alpha_c0_offset_div2:         0 (0x0)
0000AA     slice_beta_offset_div2:             0 (0x0)
0000AA    slice_data (141856 bytes)
0000AA     (ToDo):                             (Data)
022ACD   slice_layer_without_partitioning (IDR) - 0 (0x0) - Frame 0 - slice_type I - frame_num 0 - DTS 00:00:00.000 - PTS 00:00:00.017 - first_mb_in_slice 8040 (2248 bytes)
022ACD    Header (5 bytes)
022ACD     zero_byte:                          0 (0x00)
022ACE     start_code_prefix_one_3bytes:       1 (0x000001)
022AD1     nal_ref_idc:                        3 (0x3) - (2 bits)
022AD1     nal_unit_type:                      5 (0x05) - (5 bits)
022AD2    slice_header (6 bytes)
022AD2     first_mb_in_slice:                  8040 (0x001F68)
022AD5     slice_type:                         7 (0x07) - I
022AD6     pic_parameter_set_id:               0 (0x0)
022AD6     frame_num:                          0 (0x0)
022AD6     idr_pic_id:                         0 (0x0)
022AD6     no_output_of_prior_pics_flag:       No
022AD6     long_term_reference_flag:           No
022AD7     slice_qp_delta:                     -5 (0xFFFFFFFB)
022AD8     disable_deblocking_filter_idc:      0 (0x0)
022AD8     slice_alpha_c0_offset_div2:         0 (0x0)
022AD8     slice_beta_offset_div2:             0 (0x0)
022AD8    slice_data (2237 bytes)
022AD8     (ToDo):                             (Data)
023395  1 (36212 bytes)
023395   slice_layer_without_partitioning (non-IDR) - 2 (0x2) - Frame 1 - slice_type P - frame_num 1 - DTS 00:00:00.000 (36017 bytes)
023395    Header (5 bytes)
023395     zero_byte:                          0 (0x00)
023396     start_code_prefix_one_3bytes:       1 (0x000001)
023399     nal_ref_idc:                        3 (0x3) - (2 bits)
023399     nal_unit_type:                      1 (0x01) - (5 bits)
02339A    slice_header (3 bytes)
02339A     first_mb_in_slice:                  0 (0x0)
02339A     slice_type:                         5 (0x5) - P
02339A     pic_parameter_set_id:               0 (0x0)
02339A     frame_num:                          1 (0x1)
02339B     num_ref_idx_active_override_flag (0 bytes)
02339B      num_ref_idx_active_override_flag:  Yes
02339B      num_ref_idx_l0_active_minus1:      0 (0x0)
02339B     ref_pic_list_modification_flag_l0:  No
02339B     adaptive_ref_pic_marking_mode_flag: No
02339C     cabac_init_idc:                     0 (0x0)
02339C     slice_qp_delta:                     -3 (0xFFFFFFFD)
02339C     disable_deblocking_filter_idc:      0 (0x0)
02339C     slice_alpha_c0_offset_div2:         0 (0x0)
02339D     slice_beta_offset_div2:             0 (0x0)
02339D    slice_data (36012 bytes)
02339D     (ToDo):                             (Data)
02C046   slice_layer_without_partitioning (non-IDR) - 2 (0x2) - Frame 1 - slice_type P - frame_num 1 - DTS 00:00:00.000 - first_mb_in_slice 8040 (195 bytes)
02C046    Header (5 bytes)
02C046     zero_byte:                          0 (0x00)
02C047     start_code_prefix_one_3bytes:       1 (0x000001)
02C04A     nal_ref_idc:                        3 (0x3) - (2 bits)
02C04A     nal_unit_type:                      1 (0x01) - (5 bits)
02C04B    slice_header (6 bytes)
02C04B     first_mb_in_slice:                  8040 (0x001F68)
02C04E     slice_type:                         5 (0x5) - P
02C04E     pic_parameter_set_id:               0 (0x0)
02C04E     frame_num:                          1 (0x1)
02C04F     num_ref_idx_active_override_flag (0 bytes)
02C04F      num_ref_idx_active_override_flag:  Yes
02C04F      num_ref_idx_l0_active_minus1:      0 (0x0)
02C04F     ref_pic_list_modification_flag_l0:  No
02C04F     adaptive_ref_pic_marking_mode_flag: No
02C050     cabac_init_idc:                     0 (0x0)
02C050     slice_qp_delta:                     -3 (0xFFFFFFFD)
02C050     disable_deblocking_filter_idc:      0 (0x0)
02C050     slice_alpha_c0_offset_div2:         0 (0x0)
02C051     slice_beta_offset_div2:             0 (0x0)
02C051    slice_data (190 bytes)
02C051     (ToDo):                             (Data)
02C109  1 (26280 bytes)
02C109   slice_layer_without_partitioning (non-IDR) - 4 (0x4) - Frame 2 - slice_type P - frame_num 2 - DTS 00:00:00.000 (26157 bytes)
02C109    Header (5 bytes)
02C109     zero_byte:                          0 (0x00)
02C10A     start_code_prefix_one_3bytes:       1 (0x000001)
02C10D     nal_ref_idc:                        3 (0x3) - (2 bits)
02C10D     nal_unit_type:                      1 (0x01) - (5 bits)
02C10E    slice_header (3 bytes)
02C10E     first_mb_in_slice:                  0 (0x0)
02C10E     slice_type:                         5 (0x5) - P
02C10E     pic_parameter_set_id:               0 (0x0)
02C10E     frame_num:                          2 (0x2)
02C10F     num_ref_idx_active_override_flag (0 bytes)
02C10F      num_ref_idx_active_override_flag:  Yes
02C10F      num_ref_idx_l0_active_minus1:      0 (0x0)
02C10F     ref_pic_list_modification_flag_l0:  No
02C10F     adaptive_ref_pic_marking_mode_flag: No
02C110     cabac_init_idc:                     0 (0x0)
02C110     slice_qp_delta:                     -2 (0xFFFFFFFE)
02C110     disable_deblocking_filter_idc:      0 (0x0)
02C110     slice_alpha_c0_offset_div2:         0 (0x0)
02C111     slice_beta_offset_div2:             0 (0x0)
02C111    slice_data (26152 bytes)
02C111     (ToDo):                             (Data)
032736   slice_layer_without_partitioning (non-IDR) - 4 (0x4) - Frame 2 - slice_type P - frame_num 2 - DTS 00:00:00.000 - first_mb_in_slice 8040 (123 bytes)
032736    Header (5 bytes)
032736     zero_byte:                          0 (0x00)
032737     start_code_prefix_one_3bytes:       1 (0x000001)
03273A     nal_ref_idc:                        3 (0x3) - (2 bits)
03273A     nal_unit_type:                      1 (0x01) - (5 bits)
03273B    slice_header (6 bytes)
03273B     first_mb_in_slice:                  8040 (0x001F68)
03273E     slice_type:                         5 (0x5) - P
03273E     pic_parameter_set_id:               0 (0x0)
03273E     frame_num:                          2 (0x2)
03273F     num_ref_idx_active_override_flag (0 bytes)
03273F      num_ref_idx_active_override_flag:  Yes
03273F      num_ref_idx_l0_active_minus1:      0 (0x0)
03273F     ref_pic_list_modification_flag_l0:  No
03273F     adaptive_ref_pic_marking_mode_flag: No
032740     cabac_init_idc:                     0 (0x0)
032740     slice_qp_delta:                     -2 (0xFFFFFFFE)
032740     disable_deblocking_filter_idc:      0 (0x0)
032740     slice_alpha_c0_offset_div2:         0 (0x0)
032741     slice_beta_offset_div2:             0 (0x0)
032741    slice_data (118 bytes)
032741     (ToDo):                             (Data)
0327B1  1 (21125 bytes)

Так продолжается, хотя я установил pts и dts. Настройки могут быть уже не правильными (я делаю некоторые вычисления, такие как (1 / framerate) * FrameNumber), но я ожидаю, по крайней мере, некоторые числа в пунктах и ​​точках, когда я устанавливаю соответствующие поля в структуре avPacket и пишу это через av_interleaved_write_frame (outFmtCtx, & avPacket); в файл.

Что здесь может быть не так?

Edit:

(см. Ниже в комментариях загрузку моих тестовых данных и исходного файла) Одна вещь, которая меня беспокоит, это то, что если я сравниваю вывод MediaInfo из моего файла и сгенерированного muxing.c, то, что сгенерированный muxing.c в заголовке уже упоминает длительность файла как 9960 мс, тогда как у меня только 40 мс.

muxing.c также вызывает avformat_write_header до того, как будет нарисован хотя бы один кадр. Да, я предполагаю, что заголовок будет обновлен, когда будет вызван av_interleaved_write_frame или av_write_trailer , но я совершенно не понимаю механики, стоящей за ним. Может быть, кто-нибудь сможет просветить меня какой-нибудь справочной информацией любого рода.

Кроме того, я думаю, что может потребоваться извлечь некоторые SPS и PPS из моих необработанных данных (предшествующих I-фрагменту) и передать их в качестве дополнительных данных для вызова avformat_write_header . Но я просто не могу понять, нужно ли мне это вообще делать, и если да, то как это сделать.

...