私は現在、Qt DesignerツールとV4L2を使用してLinux上のWebサイトからビデオをキャプチャし、C ++でffmpegライブラリを作成するアプリケーションを開発しています。画像をキャプチャするには、libV4L2を使用しても問題はありません。 ffmpeg libsに基づくエンコーダーに送信すると、最初にエンコーダーがビデオファイルを作成し、このファイルにエンコードするための画像を受信します。私の問題は次のとおりです。エンコードは通常行われていますが、再生を開始すると録画したビデオファイルでは、通常の速度に比べて速度が速くなっているようです!だから明らかなことは、問題はビデオエンコーディングにあります、私の質問は、ffmpegエンコーディングスピード画像を管理する方法または機能がありますか????? ご協力ありがとうございました。
3 に答える
FFMpegでカスタムエンコードされたビデオを作成する場合、実際には、出力ファイルに書き込まれる各AVPacketにPTSを設定する必要があります。AVCodecContextのtime_baseを設定すると、コンテナーに何を期待するかが通知されるだけです。PTS(プレゼンテーションタイムスタンプ)は、デコーダー(ビデオを表示するとき)に、その特定のフレームを実際に表示するタイミングを指示します。
例えば:
私はFFMpegのV4L2部分から入手したAVFrameを持っています。まず、av_picture_copyを使用してこのイメージのコピーを作成する方が安全です。(したがって、エンコーダーはAVFrame構造体のすべての追加情報を調べません。)
av_picture_copy( (AVPicture*) picture, (AVPicture*) pFrame, c->pix_fmt, c->width, c->height );
picture->pts = numFrames;
エンコードされたフレームの数に基づいてポイントを設定するようになりました
pDestFrame->pts = numFrames;
今エンコード
numEncodedBytes = avcodec_encode_video( AVCodecCtx, buffer, bufferSize, pDestFrame );
今すぐAVPacketを作成し、再スケーリング後にタイムスタンプを再設定します
AVPacket pkt;
av_init_packet(&pkt);
pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, mpVideoStr->time_base );
if ( c->coded_frame->key_frame ) pkt.flags |= AV_PKT_FLAG_KEY;
pkt.stream_index = mpVideoStr->index;
pkt.data = outbuf;
pkt.size = out_size;
最後に、パケットを書き出すことができます
av_write_frame( formatCtx, &pkt );
これがH264ビデオエンコーディングで機能することは知っていますが、これを書いたときはH264にしか関心がなかったため、他のタイプのビデオで機能するかどうかは100%わかりません。
写真にタイムスタンプを追加する必要があると思います。
FFMpegは可能な限り高速にエンコード/デコードを行います。自分で同期を作成する必要があります。通常、ビデオのデコードと再生では、フレームにタイムスタンプを付けるか、少なくともオーディオクロックとフレームレートを使用してタイムスタンプを作成できます。
ただし、これは同期の方法と実装方法に大きく依存します。
たぶんFFMpegのチュートリアルはあなたにいくつかの追加のヒントを与えるでしょう
ffmpegファイルを作成するときは、フレームレートを指定する必要があります。使用しているライブラリによって異なりますが、次のようなものを探してください。
pCodecContext->time_base.den = frames_per_second;
pCodecContext->time_base.num = 1;
それ以外の場合、Webカメラから10〜15 fpsを生成しているが、ファイルのデフォルトが30 fpsの場合、高速に再生されます。
Qt ffmpegラッパーについては、http://code.google.com/p/qtffmpegwrapper/を参照してください。