2011-11-09 6 views
2

理想的にはソリューションはPythonとクロスプラットフォームになりますが、それはおそらくそうではありませんので、Linuxで動作する必要があります。 /必要ならばpython。私は、私が使っていると思っていたffmpegのためのpythonバインディングがあると思うが、fmmpegや他のものを使って、プロファイルやレベルを決める方法を理解できない。 Googleはこの問題についてもあまり役に立ちません。実用的なh.264プロファイルとレベルを判断しようとしています

プロファイルとレベルを手動で決定する必要がある場合はどのような機能を探していたのですが、それを行うことはできますが、それは問題につながり、ffmpegでビデオその機能セットでエンコードされましたか?私は、その効果について疑問に思っているのですが、エンコード後のレベルと特定のプロファイルを完全に決定することはおそらく不可能でしょうか?私はあなたがそれを解読するために知っていなければならないと思うだろうが、そうでないかもしれない。それはなぜ私がそれに関する情報を見つけることができないのかを説明します。私はこのことをしばらくトゥーウォークしてきましたが、最近私が考えていたプロジェクトを検討することに決めましたが、これは私を後押しするこの大きなものの1つです。

答えて

1

基本的には、ビットストリーム内のSPS(シーケンスパラメータセット)を特定し、その先頭のバイトをデコードする必要があります。

H.264 stream headerを参照してください。

1

ここに私が書いた小さなプログラムです。ビデオコーデックとして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; 
} 
関連する問題