我正在try 解析MP4文件中avcC框中的SPS.由于某种原因,我没有得到预期的计时值,而其他一切都很好.使用十六进制编辑器,我提取了要使用的这些字节.

byte[] spsSmall =
{
    0x67, 0x42, 0xC0, 0x1E, 0x9E, 0x21, 0x81, 0x18, 0x53, 0x4D, 0x40, 0x40,
    0x40, 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03, 0xC8,
    0xF1, 0x62, 0xEE
};

这是转换我的剪辑后的H264 Analyzer报告.mp4至.h264

Nal length 29 start code 4 bytes 
 ref 3 type 7 Sequence parameter set
   profile: 66
   constaint_set0_flag: 1
   constaint_set1_flag: 1
   constaint_set2_flag: 0
   constaint_set3_flag: 0
   level_idc: 30
   seq parameter set id: 0
   log2_max_frame_num_minus4: 6
   pic_order_cnt_type: 0
    log2_max_pic_order_cnt_lsb_minus4: 7
   num_ref_frames: 2
   gaps_in_frame_num_value_allowed_flag: 0
   pic_width_in_mbs_minus1: 34 (560)
   pic_height_in_map_minus1: 19
   frame_mbs_only_flag: 1
     derived height: 320
   direct_8x8_inference_flag: 1
   frame_cropping_flag: 0
   vui_parameters_present_flag: 1
    aspect_ratio_info_present_flag: 0
    overscan_info_present_flag: 0
    video_signal_info_present_flag: 1
     video_format: 5
     video_full_range_flag: 0
     colour_description_present_flag: 1
      colour_primaries: 1
      transfer_characteristics: 1
      matrix_coefficients: 1
    chroma_loc_info_present_flag: 0
    timing_info_present_flag: 1
     num_units_in_tick: 1
     time_scale: 60
     fixed_frame_scale: 1
    nal_hrd_parameters_present_flag: 0
    vcl_hrd_parameters_present_flag: 0
    pic_struct_present_flag: 0
    motion_vectors_over_pic_boundaries_flag: 1
    max_bytes_per_pic_denom: 0
    max_bits_per_mb_denom: 0
    log2_max_mv_length_horizontal: 10
    log2_max_mv_length_vertical: 10
    num_reorder_frames: 0
     max_dec_frame_buffering: 2

所以我应该期望num\u units\u in\u tick为1,time\u scale为60,但出于某种原因,我得到num\u units\u in\u tick为48,time\u scale为16777216.

你可以找到my implementation here

我判断了FFmpeg和其他实现,看看我是否遗漏了什么,但他们似乎和我做了同样的事情.我try 了其他剪辑,但除了时间信息之外,我仍然拥有所有正确的东西.doctor 似乎没有提供比我已经知道的更多的信息.不仅如此,我还有COLOR\u原色、transfer\u特性、matrix\u系数,在计时信息之前都等于1.如果我走得太远或太早,我会得到错误的值.用这个精确的序列得到24位的几率很低.所以我迷失在我应该做的事情上.

我找到this post saying

如果您使用的是基于场的视频,那么这将是场速率,所以

不知道这是什么意思.即使我将位数减半(32⇾ 16) 或者除以2,我得不到接近这个的东西.

推荐答案

您应该从NAL中删除emulation\u prevention\u three\u字节,即您应该搜索0x00、0x00、0x03字节对齐的序列,并从中删除0x03.因此,生成的未替换spsSmall将是:

byte[] spsSmall =
{
    0x67, 0x42, 0xC0, 0x1E, 0x9E, 0x21, 0x81, 0x18, 0x53, 0x4D, 0x40, 0x40,
    0x40, 0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xC8, 0xF1, 0x62,
    0xEE
};

Csharp相关问答推荐

无法使用并行库并行化我的代码

C#中的包版本控制

注册通用工厂的C# Dep注入

TDLib与机器人共享电话号码

NumPy s fftn in C#with pythonnet'

如何使用XmlSerializer反序列化字符串数组?

AsNoTrackingWithIdentitySolutions()似乎不起作用?

不带身份的Blazor服务器.Net 8 Cookie身份验证

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

源代码生成器项目使用`dotnet build`编译,而不是在Visual Studio中编译?

用C#从XML内部元素中获取特定值

{ or ; expected error如何解决此问题

Azure函数正在返回值列表,但该列表在Chrome中显示为空

多个参数的最小API删除

最小API定义的Swagger标头参数

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较