- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
转换 AVPicture 时在 sws_scale 处崩溃
起初我使用 sws_scale 来实际放大帧,但 cpu 开销太高,所以我决定只转换帧并调整 QImage 大小。在它工作之前,我在渲染时得到了视频显示,但现在它在 sws_scale 处崩溃。
这是用 Qt for Android 编写的,使用 FFMpeg 3.1.4。
另外,是否有另一种方法可以不使用已弃用的功能?
有人知道我为什么会在 sws_scale 崩溃吗?
VideoFrameCopy 的类
class VideoFrameCopy {
public:
VideoFrameCopy() {}
VideoFrameCopy(AVFrame *frame) { copyAVFrame(frame); }
~VideoFrameCopy();
void copyAVFrame(AVFrame *frame); // copy essential data from AVFrame
AVPicture picture;
int64_t pkt_pts = -1; // show it hasn't been initialised
int64_t best_pts;
int interlaced_frame;
int width = 0, height = 0;
int format = -1;
};
if (frame) {
if (image->width() != vid_ctx->width || image->height() != vid_ctx->height) {
QSize old_size(image->size());
// block until renderer has finished with it
while (parent->buffer_ready) {
QThread::yieldCurrentThread();
}
delete image;
image = new QImage(vid_ctx->width, vid_ctx->height, QImage::Format_RGBA8888);
parent->image = image;
if (scale_context) sws_freeContext(scale_context);
scale_context = nullptr;
qDebug() << "Video image size" << image->size() << "old" << old_size;
}
// the src width and height may need to change to use the context info instead
if (!scale_context) { // create the scale context
int src_width = vid_ctx->width;
int src_height = vid_ctx->height;
AVPixelFormat src_format = vid_ctx->pix_fmt;//(AVPixelFormat)frame->format;
int dst_width = vid_ctx->width;
int dst_height = vid_ctx->height;
AVPixelFormat dst_format = AV_PIX_FMT_RGBA;
scale_context = sws_getContext(src_width, src_height, src_format,
dst_width, dst_height, dst_format,
SWS_FAST_BILINEAR, NULL, NULL, NULL);
av_image_fill_linesizes(scale_linesizes, dst_format, vid_ctx->width);
qDebug() << "Created scale context" << scale_context;
}
if (scale_context) { // valid
scale_data[0] = image->bits();
sws_scale(scale_context,
frame->picture.data, // deprecated
frame->picture.linesize, // deprecated
0, image->height(),
scale_data,
scale_linesizes);
qDebug() << "Frame converted";
}
//av_frame_unref(frame);
//vid_frames_mutex.lock();
//if (quit) av_frame_free(&frame);
if (quit) delete frame;
else vid_frames_unused.push_back(frame);
//vid_frames_mutex.unlock();
//qDebug() << "got frame" << clock_current_frame_last << "clock" << clock_current_time;
}
vid_frames_mutex.unlock();
return frame != nullptr;
void VideoFrameCopy::copyAVFrame(AVFrame *frame) {
if (pkt_pts != -1 &&
(width != frame->width ||
height != frame->height ||
format != frame->format)
) { // picture changed?
avpicture_free(&picture); // deprecated
pkt_pts = -1;
}
width = frame->width;
height = frame->height;
format = frame->format;
interlaced_frame = frame->interlaced_frame;
if (pkt_pts == -1) { // alloc picture
if (avpicture_alloc(&picture, (AVPixelFormat)format, width, height) < 0) return; // deprecated
int size = avpicture_get_size((AVPixelFormat)format, width, height); // deprecated
uint8_t *picture_data = (uint8_t*)av_malloc(size);
avpicture_fill(&picture, picture_data, (AVPixelFormat)format, width, height); // deprecated
qDebug() << "New frame" << width << "x" << height << format;
}
pkt_pts = frame->pkt_pts;
best_pts = av_frame_get_best_effort_timestamp(frame);
av_picture_copy(&picture, (AVPicture*)frame, (AVPixelFormat)format, width, height); // deprecated
qDebug() << "picture" << picture.linesize[0] << picture.linesize[1]; // deprecated
}
VideoFrameCopy::~VideoFrameCopy() {
if (pkt_pts != -1) {
/*if (picture.data) {
av_free(picture.data);
picture.data = nullptr;
}*/
avpicture_free(&picture); // deprecated
}
}
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:659 (void VideoFrameCopy::copyAVFrame(AVFrame*)): New frame 640 x 358 0
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:667 (void VideoFrameCopy::copyAVFrame(AVFrame*)): picture 640 320
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:586 (bool FFMpegFile::getVideoFrame()): Video image size QSize(640, 358) old QSize(500, 320)
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:659 (void VideoFrameCopy::copyAVFrame(AVFrame*)): New frame 640 x 358 0
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:606 (bool FFMpegFile::getVideoFrame()): Created scale context 0x4bb49060
D/libcwengage2.so(20157): ../cwengage2/ffmpegfile.cpp:667 (void VideoFrameCopy::copyAVFrame(AVFrame*)): picture 640 320
F/libc (20157): Fatal signal 7 (SIGBUS) at 0x4e065008 (code=1), thread 20335 (QThread)
I/DEBUG ( 116): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 116): Build fingerprint: 'ODROID/odroidc/odroidc:4.4.2/KOT49H/odroidc-eng-s805_4.4.2_master-410:eng/test-keys'
I/DEBUG ( 116): Revision: '10'
I/DEBUG ( 116): pid: 20157, tid: 20335, name: QThread >>> org.qtproject.example <<<
I/DEBUG ( 116): signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 4e065008
I/DEBUG ( 116): r0 00000280 r1 00000166 r2 4e065008 r3 00000a00
I/DEBUG ( 116): r4 4d9bd030 r5 00000280 r6 4d9f4f28 r7 00000140
I/DEBUG ( 116): r8 00000280 r9 00000010 sl 4da02ee8 fp 4e065a08
I/DEBUG ( 116): ip 4d9bd2a0 sp 4c1948f8 lr 4a8f1d2c pc 4a8f4dc0 cpsr 280f0010
I/DEBUG ( 116): d0 004a004a004a004a d1 0081ffccffe70066
I/DEBUG ( 116): d2 004a004a004a004a d3 0000000000000000
I/DEBUG ( 116): d4 0000000000000000 d5 0000000000000000
I/DEBUG ( 116): d6 0000000001010101 d7 0000000001010101
I/DEBUG ( 116): d8 0000000001010101 d9 ffffffffffffffff
I/DEBUG ( 116): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 116): d12 0000000000000000 d13 ffffffffffffffff
I/DEBUG ( 116): d14 004a004a004a004a d15 004a004a004a004a
I/DEBUG ( 116): d16 0000000000000000 d17 0000000000000000
I/DEBUG ( 116): d18 0000000000000000 d19 0000000000000000
I/DEBUG ( 116): d20 0000000000000000 d21 0000000000000000
I/DEBUG ( 116): d22 0000000000000000 d23 0000000000000000
I/DEBUG ( 116): d24 0000000000000000 d25 0000000000000000
I/DEBUG ( 116): d26 0000000000000000 d27 0000000000000000
I/DEBUG ( 116): d28 004a004a004a004a d29 0000000000000000
I/DEBUG ( 116): d30 0000000000000000 d31 0000000000000000
I/DEBUG ( 116): scr 20000010
I/DEBUG ( 116):
I/DEBUG ( 116): backtrace:
I/DEBUG ( 116): #00 pc 0000edc0 /data/app-lib/org.qtproject.example-1/libswscale-4.so
I/DEBUG ( 116): #01 pc 0000bd28 /data/app-lib/org.qtproject.example-1/libswscale-4.so
I/DEBUG ( 116):
I/DEBUG ( 116): stack:
I/DEBUG ( 116): 4c1948b8 0000004b
I/DEBUG ( 116): 4c1948bc 4bb2d270
I/DEBUG ( 116): 4c1948c0 0000013c
I/DEBUG ( 116): 4c1948c4 4011edbc /system/lib/libc.so (dlmalloc+480)
I/DEBUG ( 116): 4c1948c8 4c19494a [stack:20335]
I/DEBUG ( 116): 4c1948cc 4015e384
I/DEBUG ( 116): 4c1948d0 00000010
I/DEBUG ( 116): 4c1948d4 489033ef /data/app-lib/org.qtproject.example-1/libQt5Core.so
I/DEBUG ( 116): 4c1948d8 00001000
I/DEBUG ( 116): 4c1948dc 00000000
I/DEBUG ( 116): 4c1948e0 4bb2d470
I/DEBUG ( 116): 4c1948e4 4bb2d478
I/DEBUG ( 116): 4c1948e8 4bb2d478
I/DEBUG ( 116): 4c1948ec 4bb2d470
I/DEBUG ( 116): 4c1948f0 00000002
I/DEBUG ( 116): 4c1948f4 4012109c /system/lib/libc.so (dlfree+996)
I/DEBUG ( 116): #00 4c1948f8 11111111
I/DEBUG ( 116): ........ ........
I/DEBUG ( 116): #01 4c1948f8 11111111
I/DEBUG ( 116): 4c1948fc 3fa11111
I/DEBUG ( 116): 4c194900 40000000
I/DEBUG ( 116): 4c194904 40640d79 /system/lib/libskia.so
I/DEBUG ( 116): 4c194908 00000000
I/DEBUG ( 116): 4c19490c 3ff00000
I/DEBUG ( 116): 4c194910 00000000
I/DEBUG ( 116): 4c194914 3ff00000
I/DEBUG ( 116): 4c194918 00000000
I/DEBUG ( 116): 4c19491c 3ff00000
I/DEBUG ( 116): 4c194920 00000000
I/DEBUG ( 116): 4c194924 3f800000
I/DEBUG ( 116): 4c194928 00000000
I/DEBUG ( 116): 4c19492c 00000000
I/DEBUG ( 116): 4c194930 00000000
I/DEBUG ( 116): 4c194934 00000000
I/DEBUG ( 116):
I/DEBUG ( 116): memory near r2:
I/DEBUG ( 116): 4e064fe8 00000000 00000000 00000000 00000007
...
I/DEBUG ( 116): memory map around fault addr 4e065008:
I/DEBUG ( 116): 4dd15000-4df15000 rw- /dev/mali
I/DEBUG ( 116): 4df15000-4e199000 rw-
I/DEBUG ( 116): 4e676000-4e876000 rw- /dev/mali
I/BootReceiver( 479): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)
W/ActivityManager( 479): Force finishing activity org.qtproject.example/org.qtproject.qt5.android.bindings.QtActivity
I/WindowState( 479): WIN DEATH: Window{64cf3a40 u0 org.qtproject.example/org.qtproject.qt5.android.bindings.QtActivity}
I/WindowState( 479): WIN DEATH: Window{64d0f6e0 u0 SurfaceView}
I/UsageStats( 479): No package stats for pkg:org.qtproject.example
I/art ( 118): Process 20157 terminated by signal (7)
W/ActivityManager( 479): Exception thrown during pause
W/ActivityManager( 479): android.os.DeadObjectException
W/ActivityManager( 479): at android.os.BinderProxy.transact(Native Method)
W/ActivityManager( 479): at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:660)
W/ActivityManager( 479): at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:778)
W/ActivityManager( 479): at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2614)
W/ActivityManager( 479): at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2488)
W/ActivityManager( 479): at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2196)
W/ActivityManager( 479): at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:9705)
W/ActivityManager( 479): at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:9598)
W/ActivityManager( 479): at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:10243)
W/ActivityManager( 479): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:9794)
W/ActivityManager( 479): at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
D/ActivityManager( 479): resumeClassName is com.android.launcher2.Launcher
D/ActivityManager( 479): resumePackageName is com.android.launcher
I/ActivityManager( 479): Process org.qtproject.example (pid 20157) has died.
D/ActivityManager( 479): send app_CRASH broadcast, packageName:org.qtproject.example
最佳答案
关于崩溃:了解访问冲突是否与读取输入图片或写入输出图片有关会有所帮助。无论如何,到目前为止,我只能看到代码存在一个问题:您不能使用 av_image_fill_linesizes
使用 QImage 作为目标时。 Linesizes 必须匹配实际的图像布局(就像数据指针必须匹配内存中的实际图像位置)所以使用这样的东西:
scale_linesizes[0] = image->bytesPerLine();
AVFrame
可以做AVPicture可以做的所有事情,然后是一些。例如。如果你有一个“正常”的 AVFrame(例如来自 FFmpeg 的解码器)并且你想保留一个副本,请使用
av_frame_ref
或
av_frame_copy
.这将分配内存并复制图片,或者如果可能的话,它将仅共享图片缓冲区。如果您有自己填写的 AVFrame,那么相同的函数调用应该是一样的(假设您没有填写 frame->buf[] 数组)。如果你有一个框架并且你想得到你自己的“私有(private)”/非共享副本,你可以使用
av_frame_make_writable
它会制作一个副本(如果需要)。最后,如果你想无条件地复制图片数据(你不应该这样做,但如果出于某种原因你需要),那么
av_frame_alloc
,
av_frame_copy_props
,填充宽度/高度/格式字段,
av_frame_get_buffer
最后是
av_frame_copy
.
关于qt - 将 AVFrame 转换为 RGB32 时在 sws_scale 处崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504164/
我需要将 YUV 转换为 RGB。我还需要 RGB 值在有限范围内 (16-235)。我尝试使用 sws_scale 函数来完成这项任务。 我的代码你可以在下面看到。但是转换后我得到的黑色像素是 (0
我正在使用 sws_scale将一组 RGB32 图像转换为 YUV420 格式。每张图像都与前一张非常相似,它们仅在矩形区域 Q 上有所不同。 我的问题是如何利用 Q 来加快转换过程?应在 sws_
尝试将任意视频读取为纯 RGB24 像素,因此使用 sws_scale() 转换帧这边走: //... AVFrame* pic_out = av_frame_alloc();
我必须使用 sws_scale 对从 CAIRO_FORMAT_ARGB32 到 AV_PIX_FMT_YUV420P 的一系列帧进行编码。从 ffmpeg 文档我了解到源格式的 AV 等效项是 AV
在播放 4K 视频时,用户可以调整播放器窗口的大小 - 结果图像将在运行时平滑缩放。 另一方面 - 使用 libav 编写的程序逐帧读取 4k 视频文件并使用 sws_scale 函数将其缩小,但效果
我的代码非常简单;它使用 YUV420P 数据,调整其大小,并生成 PNG 或 JPEG 图像(OS X Lion、Apple 的 gcc 4.2.1)。效果很好;我正在使用 ffmpeg (HEAD
/* values for the flags, the stuff on the command line is different */ #define SWS_FAST_BILINEAR
我正在尝试使用 ffmpeg 的 sws_scale 函数将 AVFrame 从 JPEG(YUV 像素格式)转换为 RGB24 格式。我按如下方式设置 SwsContext: struct SwsC
我正在开发一个 OpenGL 视频应用程序,我想在其中以全屏模式渲染视频。我正在尝试使用以下代码渲染视频: GLFWmonitor* monitor = glfwGetPrimaryMonitor()
我正在尝试使用 ffmpeg 库将图像编码为视频。 我有这些全局参数: //Global params AVCodec *codec; AVCodecContext *codecCt
我正在用 libav 制作电影播放器。我正在解码视频数据包,我正在反向工作,我正在寻找工作。所有这些都无法在 x86 android 模拟器上运行,但无法在真正的 android 手机上运行(ar
我正在解码相机编解码器,然后总是将其编码为 H264更具体地说qsv如果支持。目前有2个摄像头要测试。一种是H264编码,一个是rawvideo .问题来自 rawvideo .像素格式为BGR24并
尝试编写使用 libav 的程序从任意视频中提取原始像素数据(~BMP)。一切顺利,除了 sws_scale()转换失败 AVFrame到 RGB24。 我制定了它的最小示例,其中 AVFrame正在
我正在使用 ffmpeg 编写视频播放器(仅限 Windows,Visual Studio 2015,64 位编译)。 对于普通视频(最高 4K @ 30FPS),它的效果非常好。但是对于我的最大目标
我有一个基于sws_scale的颜色空间转换函数.在应用程序的生命周期中,它将被多个不同的线程调用。但是,我不知道 sws_scale 的线程安全性如何,而且我没有在其文档中找到它。 我假设每个线程都
我想将 YUV420P 图像(从 H.264 流接收)转换为 RGB,同时调整它的大小,使用 sws_scale. 原始图像的大小为 480 × 800。只需使用相同的尺寸进行转换即可。 但是,当我尝
我的代码有问题。 我想将 YUV 转换为 RGB,但是 sws_scale始终返回 0 并填充数据 00000000..NULL 我尝试谷歌搜索,但我找不到任何问题。 我需要 AVPicture 还是
我正在使用 FFMpeg 解码视频,并想使用 OpenGL 编辑解码帧,但为了做到这一点,我需要将 AVFrame 中的数据从 YUV 转换为 RGB。 为了做到这一点,我创建了一个新的 AVFram
我正在将 PIX_FMT_ARGB 格式的图片混合到 mp4 视频中。 一切都很好,除了输出图像的最后一个像素行被搞砸了,在大多数情况下最后一行是完全黑色的,有时还有其他颜色,它似乎在某种程度上取决于
我想通过使用 ffmpeg 的 func--->sws_scale() 来调整图片的大小。 有没有人知道怎么做? 你有这个函数的源代码吗? 最佳答案 首先你需要创建一个SwsContext (您只需要
我是一名优秀的程序员,十分优秀!