2017-05-16 14 views
0

ビデオ内の定義済みの特定のコンテンツを検出したい。このため私は既に識別されたビデオと別の入力ビデオを使います。私は特定されたビデオのデータを読み、バイト配列はテキストファイルに保存されました。ここで、保存されたテキストファイルの内容と入力ビデオコンテンツを比較したいと思います。C++でテキストファイルを読むには?

あなたは、出力あなたのoutdataあなたはおそらくスペースでバイトを区切る必要がある場合にはこれが私のコード

void CFfmpegmethods::VideoRead(){ 
    av_register_all(); 
    avformat_network_init(); 
    ifstream inFile; 
    inFile.open("H:\\Sanduni_projects\\sample_ad.txt"); 
    const char *url = "H:\\Sanduni_projects\\ad_1.mp4"; 
    AVDictionary *options = NULL; 
    AVFormatContext *s = avformat_alloc_context(); 

    AVPacket *pkt = new AVPacket(); //this structure stores compressed data 

    //open an input stream and read the header 
    int ret = avformat_open_input(&s, url, NULL,NULL); 

    //avformat_find_stream_info(s, &options); //finding the missing information 

    if (ret < 0) 
     abort(); 

    if (!inFile) { 
     cerr << "Unable to open file datafile.txt"; 
     exit(1); // call system to stop 
    } 

    av_dict_set(&options, "video_size", "640x480", 0); 
    av_dict_set(&options, "pixel_format", "rgb24", 0); 

    if (avformat_open_input(&s, url, NULL, &options) < 0){ 
     abort(); 
    } 
    av_dict_free(&options); 
    AVDictionaryEntry *e; 

    if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { 
     fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); 
     abort(); 
    } 

    int i = 1; 
    int64_t duration = 0; 
    int size = 0; 
    uint8_t *data; //Unsigned integer type with a width of exactly 8 bits. 
    int sum = 0; 

    int total_size = 0; 
    int64_t total_duration = 0; 
    int packet_size = 0; 
    int64_t stream_index = 0; 
    int64_t bit_rate = 0; 
    AVBufferRef *buf; 

    //writing data to a file 
    outdata.open("H:\\Sanduni_projects\\sample_ad.txt"); 
    //outdata.open("H:\\Sanduni_projects\\log.txt"); 

    if (!outdata){ 
     cerr << "Error: file could not be opened" << endl; 
     exit(1); 
    } 

    //Split what is stored in the file into frames and return one for each call 
    //returns the next frame of the stream 

    while(1){ 
     int frame = av_read_frame(s, pkt); //one frame is readed. 
     if (frame < 0) break; 
     size = pkt->size; 
     data = pkt->data; 

     for (int j = 0; j < size; j++){ 
      for (int k = 0; k < 12; k++){ 
       while (!inFile.eof){ 


       } 
       //if (data[j] !=) break; 
      } 
     } 

     //int decode = avcodec_send_packet(avctx, pkt); 
    } 

    //make the packet free 
    av_packet_unref(pkt); 
    delete pkt; 

    cout << "total size: " << total_size << endl; 
    cout << "total duration:" << total_duration << endl; 

    outdata.close(); 

    //Close the file after reading 
    avformat_close_input(&s); 
} 


void CFfmpegmethods::SampleAdCreation(){ 
    av_register_all(); 
    const char *url_ref = "H:\\Sanduni_projects\\sample_ad.mp4"; 
    AVDictionary *options = NULL; 
    AVDictionary *options_ref = NULL; 
    AVFormatContext *s = avformat_alloc_context(); 
    AVPacket *pkt = new AVPacket(); //this structure stores compressed data 


    //open an input stream and read the header 
    int ret = avformat_open_input(&s, url_ref, NULL, NULL); 

    if (ret < 0) 
     abort(); 

    av_dict_set(&options, "video_size", "640x480", 0); 
    av_dict_set(&options, "pixel_format", "rgb24", 0); 

    if (avformat_open_input(&s, url_ref, NULL, &options) < 0){ 
     abort(); 
    } 

    av_dict_free(&options); 
    AVDictionaryEntry *e; 

    if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { 
     fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); 
     abort(); 
    } 

    uint8_t *data; 

    //writing data to a file 
    outdata.open("H:\\Sanduni_projects\\sample_ad.txt"); 

    if (!outdata){ 
     cerr << "Error: file could not be opened" << endl; 
     exit(1); 
    } 

    for (int m = 0; m < 12; m++){ 
     int size = pkt->size; 
     int frame = av_read_frame(s, pkt); 
     if (frame < 0) break; 

     data = pkt->data; 

     for (int j = 0; j < size; j++){ 
      outdata << data[j]; 
     } outdata<<endl; 
    } 

    //make the packet free 
    av_packet_unref(pkt); 
    delete pkt; 

    outdata.close(); 

    //Close the file after reading 
    avformat_close_input(&s); 
} 

答えて

0

です:

for (int j = 0; j < size; j++){ 
     outdata << data[j] << ' '; 
    } 

をそれ以外のバイト{11は、1} {1と同じ出力を生成します。 、11}。

そして、あなたのINFILEからこれらのバイトを読むことができます:

unsigned char dataByte; 
while (inFile >> dataByte) 
{ 
    do something with dataByte; 
} 
+0

事は、私は、データセットから構成されたテキストファイルを持っています。入力ビデオはそれと連続して一致しなければならない –

+0

ファイルに書き込むときに、新しいフレームを使って各フレームデータを書き出しました。このコードでは、ビデオを入力し、そのビデオのフレームごとに取りたいと思っています。次に、その動画が連続するフレームのファイルの内容と一致するかどうかを一致させたいと思います。これどうやってするの? –

関連する問題