2011-12-15 2 views
4

私は、Webカメラからキャプチャした画像をlibx264でエンコードされたmp4ファイルに書き込むために、C++ライブラリを使用しています。 エンコーディングは正常に動作していますが、開始時にバッファに40フレームを書き込みます。私がファイルを閉じると、これらのフレームはフラッシュされないので、約6秒のビデオは未書き込みのままです(カムは約6fpsです)。H264をFFMPEGでエンコードする際にバッファをダンプするにはどうすればよいですか?

だから私は呼んでいる:

out_size = libffmpeg::avcodec_encode_video(codecContext, data->VideoOutputBuffer,data->VideoOutputBufferSize, data->VideoFrame); 

// if zero size, it means the image was buffered 
if (out_size > 0) 
{ 
//... write to file 
} 

私は、バッファに残っている画像にアクセスする方法を見ることはできません。何か案は?

答えて

6

私はバッファをフラッシュするために次のコードを使用してこの作業をしています。しばらくに#(1); "遅延フレーム" されている必要があります...

void VideoFileWriter::Flush(void) 
{ 
if (data != nullptr) 
{ 
    int out_size = 0; 
    int ret = 0; 

    libffmpeg::AVCodecContext* c = data->VideoStream->codec; 
    /* get the delayed frames */ 
    while (1) { 
     libffmpeg::AVPacket packet; 
     libffmpeg::av_init_packet(&packet); 

     out_size = libffmpeg::avcodec_encode_video(c, data->VideoOutputBuffer, data->VideoOutputBufferSize, NULL); 
     if (out_size < 0) { 
      //fprintf(stderr, "Error encoding delayed frame %d\n", out_size); 
      break; 
     } 
     if (out_size == 0) { 
      break; 
     } 
     if (c->coded_frame->pts != AV_NOPTS_VALUE) { 
      packet.pts = av_rescale_q(c->coded_frame->pts, 
          c->time_base, 
          data->VideoStream->time_base); 
      //fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts); 
     } else { 
      //fprintf(stderr, "Video Frame PTS: not set\n"); 
     } 
     if (c->coded_frame->key_frame) { 
      packet.flags |= AV_PKT_FLAG_KEY; 
     } 
     packet.stream_index = data->VideoStream->index; 
     packet.data = data->VideoOutputBuffer; 
     packet.size = out_size; 

     ret = libffmpeg::av_interleaved_write_frame(data->FormatContext, &packet); 
     if (ret != 0) { 
      //fprintf(stderr, "Error writing delayed frame %d\n", ret); 
      break; 
     } 
    } 
    libffmpeg::avcodec_flush_buffers(data->VideoStream->codec); 
} 
} 
+0

I動かす#libffmpeg :: avcodec_flush_buffers(データ - > VideoStream->コーデック) - 私が間違っている用語を探していたようですループ、それは私のために動作しません、症状は、ディスクにデータをフラッシュしていません。 – Sean

1

Hereは、avcodecでフラッシュする必要があるいくつかの内部バッファを使用していることを示す、avfodecに関するチュートリアルです。これらのバッファのフラッシュがどのように行われたかを示すコードもあります(「バッファのフラッシュ」)。

関連する問題