我正在http://dranger.com/ffmpeg/tutorial01.html中关注ffmpeg教程。
我刚刚发现avpicture_get_size
函数已被弃用。
所以我查看了ffmpeg的文档(https://www.ffmpeg.org/doxygen/3.0/group__lavu__picture.html#ga24a67963c3ae0054a2a4bab35930e694)并找到了替换av_image_get_buffer_size
。
但我无法理解align
参数含义' lineize alignment' ......
这是什么意思?
答案 0 :(得分:15)
FFmpeg的某些部分,特别是libavcodec,需要对齐的linesizes [],这意味着它需要:
assert(linesize[0] % 32 == 0);
assert(linesize[1] % 32 == 0);
assert(linesize[2] % 32 == 0);
这允许它使用快速/对齐的SIMD例程(例如SSE2 / AVX2 movdqa
或vmovdqa
指令)来进行数据访问,而不是使用较慢的未对齐的对应程序。
此align
函数的av_image_get_buffer_size
参数是此行对齐,您需要它,因为缓冲区的大小受其影响。例如,YUV缓冲区中Y平面的大小实际上不是宽度*高度,它的线条大小为[0] *高度。您会看到(特别是对于不是16或32的倍数的图像大小),当您将align
增加到2的更高幂时,返回值会慢慢增加。
实际上,如果你打算使用这张图片作为输出缓冲区来调用例如avcodec_decode_video2
,这应该是32.对于swscale / avfilter,我认为没有绝对的要求,但你建议你仍然要做到32。
答案 1 :(得分:7)
我的做法:
1 。 avpicture 弃用问题,我用 AVFrame &替换了avpicture功能 imgutils 功能。代码示例:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.0/jquery.validate.min.js"></script>
<form action="index.php" name="formInput" method="POST" autocomplete="off">
<label class="input"><span class="fontBold fontItalic">Email address</span>
<br>
<input type="email" name="pgEmail" id="txtNewEmail" oninput="verifyPEmail();" value="">
</label>
<div class="registrationFormAlert" id="divCheckValidEmail"></div>
<label class="input"><span class="fontBold fontItalic">Password</span>
<br>
<input type="password" name="pass1" id="pass1" oninput="verifyPass1();" value="">
</label>
<div class="registrationFormAlert" id="divCheckPass1"></div>
<label class="input"><span class="fontBold fontItalic">Verify Password</span>
<br>
<input type="password" name="pass2" id="pass2" oninput="verifyPass2();" value="">
</label>
<div class="registrationFormAlert" id="divCheckPass2"></div>
</form>
...
//AVPicture _picture;
AVFrame *_pictureFrame;
uint8_t *_pictureFrameData;
...
//_pictureValid = avpicture_alloc(&_picture,
// AV_PIX_FMT_RGB24,
// _videoCodecCtx->width,
// _videoCodecCtx->height) == 0;
_pictureFrame = av_frame_alloc();
_pictureFrame->width = _videoCodecCtx->width;
_pictureFrame->height = _videoCodecCtx->height;
_pictureFrame->format = AV_PIX_FMT_RGB24;
int size = av_image_get_buffer_size(_pictureFrame->format,
_pictureFrame->width,
_pictureFrame->height,
1);
//dont forget to free _pictureFrameData at last
_pictureFrameData = (uint8_t*)av_malloc(size);
av_image_fill_arrays(_pictureFrame->data,
_pictureFrame->linesize,
_pictureFrameData,
_pictureFrame->format,
_pictureFrame->width,
_pictureFrame->height,
1);
2.align parameter
首先我将对齐设置为 32 ,但对于某些视频流,它不起作用,导致图像失真。然后我将其设置为 16 (我的环境:mac,Xcode,iPhone6 ),一些流运行良好。但最后我将对齐设置为 1 ,因为我找到了this
if (_pictureFrame) {
av_free(_pictureFrame);
if (_pictureFrameData) {
free(_pictureFrameData);
}
}
答案 2 :(得分:2)
如果您在3.2版中查看avpicture_get_size的定义,请看以下代码:
<div class="row">
<div class="col-sm-12">
<div id="table_filter" class="dataTables_filter pull-left">
<label>
<input type="search" class="form-control input-sm" placeholder="Search" aria-controls="table">
</label>
</div>
</div>
</div>
它只是调用建议的函数:int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
{
return av_image_get_buffer_size(pix_fmt, width, height, 1);
}
,av_image_get_buffer_size
参数设置为align
。我没有进一步了解为什么1
用于折旧函数的全部意义。像ffmpeg一样,人们可以通过阅读正确的代码和足够的代码(通过一些代码实验)来解决这个问题。