关于播放的问题
我的问题是这样的,我自己写了一个Filter, 继承CTransformFilter,在Transform函数哪里处理视频数据.实现下面功能,
假如视频数据如下
1 2 3 4
5 6 7 8
经过我的处理变成下面
1 2
5 6
3 4
7 8
然后我就测试,第一种情况是这样的,我在graphedit中直接用我的MyFilter链接Render,在处理RGB32数据的时候,在Transform函数哪里要下面的处理才正常显示.
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = pInfo->bmiHeader.biHeight;
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * abs(nHeight) / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < abs(nHeight); nIndex++)
{
for (int i = 0; i < nWidth / 2; i ++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = abs(nHeight) - 1; t >= 0; t--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - t) * (nWidth / 2)] = pBuffer1[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = abs(nHeight) - 1; n >= 0; n--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - n) * (nWidth / 2)] = pBuffer2[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
在第二种测试的情况是这样的。
1.mpg --> mpeg-1 Stream Splitter --> MPEG Video Decoder --> MyFilter --> ffdshow video encoder --> AVI Mux --> 30.avi
其中我看了,它们的链接的子类型也是RGB32的,但在MyFilter的Transform函数哪里要下面的处理才可以播放30.avi文件正常
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = abs(pInfo->bmiHeader.biHeight);
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * nHeight / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
{
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
}
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < nHeight; nIndex++)
{
for (int i = 0; i < nWidth / 2; i++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = 0; t < nHeight; t++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + t * (nWidth / 2)] = pBuffer2[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = 0; n < nHeight; n++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + n * (nWidth / 2)] = pBuffer1[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
那我想请问的是,为什么它们的处理会不一样的?是否我某些情况没有考虑清楚?
假如视频数据如下
1 2 3 4
5 6 7 8
经过我的处理变成下面
1 2
5 6
3 4
7 8
然后我就测试,第一种情况是这样的,我在graphedit中直接用我的MyFilter链接Render,在处理RGB32数据的时候,在Transform函数哪里要下面的处理才正常显示.
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = pInfo->bmiHeader.biHeight;
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * abs(nHeight) / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < abs(nHeight); nIndex++)
{
for (int i = 0; i < nWidth / 2; i ++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = abs(nHeight) - 1; t >= 0; t--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - t) * (nWidth / 2)] = pBuffer1[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = abs(nHeight) - 1; n >= 0; n--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - n) * (nWidth / 2)] = pBuffer2[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
在第二种测试的情况是这样的。
1.mpg --> mpeg-1 Stream Splitter --> MPEG Video Decoder --> MyFilter --> ffdshow video encoder --> AVI Mux --> 30.avi
其中我看了,它们的链接的子类型也是RGB32的,但在MyFilter的Transform函数哪里要下面的处理才可以播放30.avi文件正常
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = abs(pInfo->bmiHeader.biHeight);
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * nHeight / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
{
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
}
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < nHeight; nIndex++)
{
for (int i = 0; i < nWidth / 2; i++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = 0; t < nHeight; t++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + t * (nWidth / 2)] = pBuffer2[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = 0; n < nHeight; n++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + n * (nWidth / 2)] = pBuffer1[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
那我想请问的是,为什么它们的处理会不一样的?是否我某些情况没有考虑清楚?
...全文
相关推荐
解决ios audio无法播放问题
解决ios audio无法播放问题iOS audio 无法播放问题是一个常见的问题,特别是在使用ajax回调函数时。
QT中播放音乐遇到的问题合集
1,使用 QSound播放 wav格式的文件 1、在.pro 文件中加 QT += multimedia,才可以使用Qsound 2、在使用的文件中添加头文件:#include 3、在main函数中可直接调用Qsound, 2.使用QMediaPlayer 播放mp3 1、在.pro文件加入 QT += multimedia 2.、加入头文件 #include <QMediaPlayer> 3、播放音乐 QMediaPlayer* player = new QMe
Android使用VideoView出现无法播放此视频问题的解决方法
然而,在实际使用过程中,可能会遇到“无法播放此视频”的问题,这通常由多种因素导致。本文将深入探讨这个问题,并提供解决方法。首先,我们来看一下使用VideoView播放视频的基本步骤:1.
使用ffmepg解决mp4文件播放问题
首先,MP4 文件播放问题可能源于编码格式不被播放器支持、容器格式错误、元数据位置不当或者缺少必需的流信息。FFmpeg 可以帮助我们检查和修复这些问题。1.
Android MediaPlayer 音频倍速播放 调整播放速度问题
"Android MediaPlayer 音频倍速播放调整播放速度问题"Android MediaPlayer音频倍速播放是指在Android应用程序中使用MediaPlayer组件来播放音频文件,并且可以调整播放速度的功能


多媒体/流媒体开发
