2

ウェブカメラからキャプチャするアプリケーション(C ++ / Qt Designer 4.6で、などのライブラリを使用)をプログラミングしてffmpegいて、キャプチャしたものをIP経由で送信したいので、に送信してサーバーアプリケーションで受信することに成功しましたしかし、問題は遅すぎます。圧縮されていないため、IPを介したライブビデオストリーミングという目的の結果が得られません。私の質問は、どうすれば圧縮できますか?私はそれをフォーマットに変換すると思いますが、私はそれを理解できません、これは利用可能なものを送るための私のコードからのいくつかの行です:v4l2QImageQTcpSocketQImageQImageYUVQImage

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
imsocket->write(ba);
4

4 に答える 4

2

各フレームをQImageとして圧縮してネットワーク経由で送信するのではなく、MPEG圧縮ビデオストリームを送信する方がよいでしょう。

MPEG圧縮ビデオストリームは、最初のフレームにフルスケール画像を使用し、その後、後続のフレームごとに変更されたピクセルのみを記録する手法を使用します。これにより、ネットワーク上で最大の圧縮とスムーズなビデオ再生が実現します。

クライアント側では、ライブラリによって生成されたフレームを圧縮されたMPEGストリームから取得して再生します。

于 2011-05-16T12:31:19.757 に答える
1

上記と同様の問題が発生しました。コードは次のようになりました。

QBuffer buffer;
buffer.open(QIOdevice::WriteOnly);
QDataStream stream(&buffer);
stream << image;

QElapsedTimerを使用すると、1024x768サイズの画像の場合、画像のエンコードに500ミリ秒以上かかることがわかりました。valgrindを使用して、QImageWriter :: write(QImage)から呼び出されたpng_write_imageに時間が費やされていることがわかりました。

代わりにJPGとしてエンコードするようにコードを変更すると、同じ画像に対してコードが5ミリ秒で実行されるようになりました。結果のコードは次のようになります。

QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
image.save(&buffer,"JPEG");

残念ながら、PNGではなくJPGで画像をエンコードするようにQDataStreamに指示する方法が見つからなかったため、次のように画像をデコードするようにデコード側を調整する必要がありました。

image.load(&buffer, "JPEG");
于 2014-03-22T10:21:09.617 に答える
0

画像を送信する前に、バイト配列を圧縮してからサーバー上で解凍することができますこれはあなたに素晴らしい後押しを提供するはずです。

QByteArray arr, cArr;
cArr = qCompress(arr);
于 2011-05-10T17:59:24.273 に答える
0

最適化の最初のルールに従う必要があります。アプリケーションが時間を費やしている場所を測定していない場合は、最適化しないでください。アプリケーションのどの部分が遅いかを推測しているだけだと思います。

于 2011-05-16T11:38:55.220 に答える