デコードされたffmpegフレームに自分のアルファチャンネルを追加するためのすばらしい方法を探しています。デコードされたffmpegフレームにアルファチャンネルを書き込む
私はRGB情報を持つAVIファイルを持っており、透明アルファチャンネル(グレースケール)を記述した同期ビデオストリームを持っています。 ffmpegを使ってAVIファイルをデコードしている間に、出力フレームをRGBAに変換し、自分自身のアルファ情報を追加したい。最後に、半透明のビデオストリームを取得します。
libswscaleやlibswresampleに最適化された関数はありますか?ピクセルを反復するよりも、このようなことはうまくいくのでしょうか?
基本的に私は、私だけがsws_scale_and_add_alphaような機能を持っていた場合、このような機能を書くことができるようにしたいと思います:
void* FFmpegLib_nextFrame_withAlpha(void* _handle, uint8_t* my_alpha_channel)
{
FFmpegLibHandle* handle = (FFmpegLibHandle*)_handle;
AVPacket packet;
int frameFinished;
while(av_read_frame(handle->pFormatCtx, &packet) >= 0) {
// Is this a packet from the video stream?
if(packet.stream_index==handle->videoStream) {
// Decode video frame
avcodec_decode_video2(handle->pCodecCtx, handle->pFrame, &frameFinished, &packet);
// Did we get a video frame?
if(frameFinished) {
sws_scale_and_add_alpha
(
handle->sws_ctx,
(uint8_t const * const *)handle->pFrame->data,
handle->pFrame->linesize,
0,
handle->pCodecCtx->height,
handle->pFrameARGB->data,
handle->pFrameARGB->linesize,
my_alpha_channel
);
return handle->pFrameARGB->data;
}
}
}
return NULL;
}
ありがとう@halfelf。私はalphamergeの例を見て、c実装に潜入しました。実際には、argb画像ピクセルをループするので、実際には2番目のプログラミングオプションのようです。パフォーマンス上の理由から、同じ時間にアルファチャンネルを変換して追加するsws_scaleの代わりを使うなど、ワンショットでやりたいと思っていました。実際には最後に、OpenGLシェーダのテクスチャとしてrgbとアルファチャンネルを使用していますので、シェーダの中で色と透明度を組み合わせるのが最善の方法です。 –
@Micそれを聞いてよかったです。実際に私は前にCUDAで同様のことをしてきました。私はその性能がOpenGLほど良いと信じています。 – halfelf