Encoding 尝试确定h.264配置文件&;务实地

Encoding 尝试确定h.264配置文件&;务实地,encoding,ffmpeg,h.264,video-encoding,Encoding,Ffmpeg,H.264,Video Encoding,理想情况下,解决方案应该是python和跨平台的,但这可能不太可能,所以我只需要它在linux中工作,如果需要的话,我可以使用c扩展来连接w/python。我看到有一个用于ffmpeg的python绑定,我正在考虑使用它,但是我不知道如何使用fmmpeg或其他任何东西来确定概要文件和级别,更不用说实用性了。谷歌在这件事上也帮不了什么忙 我已经能够确定如果我需要手动确定配置文件和级别,我会寻找什么功能,然后我可以这样做,但这就引出了一个问题,ffmpeg可以确定视频是否使用该功能集编码吗?我想我想

理想情况下,解决方案应该是python和跨平台的,但这可能不太可能,所以我只需要它在linux中工作,如果需要的话,我可以使用c扩展来连接w/python。我看到有一个用于ffmpeg的python绑定,我正在考虑使用它,但是我不知道如何使用fmmpeg或其他任何东西来确定概要文件和级别,更不用说实用性了。谷歌在这件事上也帮不了什么忙


我已经能够确定如果我需要手动确定配置文件和级别,我会寻找什么功能,然后我可以这样做,但这就引出了一个问题,ffmpeg可以确定视频是否使用该功能集编码吗?我想我想知道的是,在编码之后,是否不可能完全确定级别和特定的配置文件?我想你必须知道才能破译它,但也许不是;这就解释了为什么我找不到关于它的任何信息。我一直在玩弄这个问题,但最近决定考虑一个我一直在考虑的项目,但这是阻碍我前进的一个重要原因。

< P>基本上你需要在比特流中识别SPS(序列参数集)并解码它的几个领先字节。
请参阅此处的链接。

这是我编写的一个小程序。它打印使用h264作为视频编解码器的MP4文件的配置文件和级别。 您可以使用以下命令行编译它:

gcc -std=c99 printProfileAndLevel.c -o printProfileAndLevel
以下是C源代码:

#include <stdio.h>
#include <stdlib.h>

void printProfile(int profile_idc, int profile_iop, int level_idc) {
  switch(profile_idc) {
    case 0x42: printf("Baseline Profile"); break;
    case 0x4D: printf("Main Profile"); break;
    case 0x58: printf("Extended Profile"); break;
    case 0x64: printf("High Profile"); break;
    default:   printf("Unknown profile (%x)", profile_idc);
  }

  switch(level_idc) {
    case 0x15: printf(" @ Level 2.1\n"); break;
    case 0x1F: printf(" @ Level 3.1\n"); break;
    case 0x29: printf(" @ Level 4.1\n"); break;
    case 0x33: printf(" @ Level 5.1\n"); break;
    default:   printf(" @ unknown level (%x)", level_idc);
  }
}

int main(int argc, char* argv[])
{
  if(argc < 2) {
    printf("syntax: %s <files>\n", argv[0]);
    exit(-1);
  }

  int buffsize = 1024;
  char *buffer = malloc(buffsize + 1);

  for(int nArg = 1; nArg < argc; nArg++) {
    printf("File %s:\n", argv[nArg]);
    FILE *file = fopen(argv[nArg], "r+");
    if(file == NULL) {
      printf("Cannot open input file %s\n", argv[nArg]);
      continue;
    }

    int nRead = 0;
    nRead = fread(buffer, 1, buffsize, file);

    for(int i = 0; i < nRead - 7; i++) {
      if(buffer[i] == 0x61 && buffer[i+1] == 0x76 && buffer[i+2] == 0x63 && buffer[i+3] == 0x43) {
        printProfile(buffer[i+5], buffer[i+6], buffer[i+7]);
      }
    }
    fclose(file);
  }
  free(buffer);
  return 0;
}
#包括
#包括
无效打印配置文件(内部配置文件\u idc、内部配置文件\u iop、内部级别\u idc){
交换机(配置文件\u idc){
案例0x42:printf(“基线配置文件”);中断;
案例0x4D:printf(“主配置文件”);中断;
案例0x58:printf(“扩展轮廓”);中断;
案例0x64:printf(“高调”);中断;
默认值:printf(“未知配置文件(%x)”,配置文件\u idc);
}
交换机(idc级){
案例0x15:printf(“@level2.1\n”);中断;
案例0x1F:printf(“@Level 3.1\n”);中断;
案例0x29:printf(“@Level 4.1\n”);中断;
案例0x33:printf(“@Level 5.1\n”);中断;
默认值:printf(“@unknown level(%x)”,level_idc);
}
}
int main(int argc,char*argv[])
{
如果(argc<2){
printf(“语法:%s\n”,argv[0]);
出口(-1);
}
int buffsize=1024;
char*buffer=malloc(buffsize+1);
for(int-nArg=1;nArg