当我尝试使用 libmpeg2 解码视频时,出现错误 31c 和 301,我在代码中找不到它们,并且输出视频已损坏。
我已经从 https://android.googlesource.com/platform/external/libmpeg2/ 下载了 libmpeg2。要在 x86 上重现此内容,请创建一个构建目录并运行 cmake.. 和 make。对于我下载的测试视频https://filesamples.com/samples/video/mpeg/sample_1280x720.mpeg对于我使用的配置文件:
--input sample.mpeg
--output out.yuv
--save_output 1
--num_frames -1
--chroma_format YUV_420P
--share_display_buf 0
--max_wd 1280
--max_ht 720
--num_cores 1
--loopback 0
--display 0
--fps 30
--arch X86_GENERIC
--soc GENERIC
当我运行
./mpeg2dec x86_test.cfg
时,我得到以下输出:
FrameNum: 1 TimeTaken(microsec): 400 AvgTime: 400 PeakAvgTimeMax: 50 Output: 0 NumBytes: 1993
FrameNum: 2 TimeTaken(microsec): 1942 AvgTime: 1171 PeakAvgTimeMax: 292 Output: 0 NumBytes: 143360
FrameNum: 3 TimeTaken(microsec): 3644 AvgTime: 1995 PeakAvgTimeMax: 748 Output: 1 NumBytes: 278528
FrameNum: 4 TimeTaken(microsec): 2374 AvgTime: 2090 PeakAvgTimeMax: 1045 Output: 1 NumBytes: 147456
FrameNum: 5 TimeTaken(microsec): 3193 AvgTime: 2310 PeakAvgTimeMax: 1444 Output: 1 NumBytes: 77824
FrameNum: 6 TimeTaken(microsec): 1274 AvgTime: 2137 PeakAvgTimeMax: 1603 Output: 1 NumBytes: 36864
FrameNum: 7 TimeTaken(microsec): 788 AvgTime: 1945 PeakAvgTimeMax: 1701 Output: 0 NumBytes: 12291
Error in video Frame decode : ret 1 Error 301
FrameNum: 8 TimeTaken(microsec): 996 AvgTime: 1826 PeakAvgTimeMax: 1826 Output: 1 NumBytes: 18429
FrameNum: 9 TimeTaken(microsec): 3218 AvgTime: 1981 PeakAvgTimeMax: 2178 Output: 1 NumBytes: 14336
FrameNum: 10 TimeTaken(microsec): 1688 AvgTime: 1951 PeakAvgTimeMax: 2178 Output: 1 NumBytes: 4096
FrameNum: 11 TimeTaken(microsec): 1436 AvgTime: 1904 PeakAvgTimeMax: 2178 Output: 1 NumBytes: 6144
***
FrameNum: 367 TimeTaken(microsec): 1570 AvgTime: 1549 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 6132
FrameNum: 368 TimeTaken(microsec): 1666 AvgTime: 1549 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 6144
FrameNum: 369 TimeTaken(microsec): 1091 AvgTime: 1548 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 4096
FrameNum: 370 TimeTaken(microsec): 784 AvgTime: 1546 PeakAvgTimeMax: 2218 Output: 0 NumBytes: 11212
Error in video Frame decode : ret 1 Error 31c
FrameNum: 371 TimeTaken(microsec): 1127 AvgTime: 1545 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 1076
FrameNum: 372 TimeTaken(microsec): 634 AvgTime: 1542 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 6144
FrameNum: 373 TimeTaken(microsec): 1046 AvgTime: 1541 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 4096
FrameNum: 374 TimeTaken(microsec): 2412 AvgTime: 1543 PeakAvgTimeMax: 2218 Output: 1 NumBytes: 43008
***
Summary
Input filename : sample.mpeg
Output Width : 1280
Output Height : 720
Bitrate @ 30 fps(mbps) : 2.12
Average decode time(micro sec) : 1497
Avg Peak decode time( 8 frames) : 5334
FPS achieved (with format conv) : 667.96
所以我得到了这两个在代码中找不到的错误,解码的视频已损坏并且摘要数字不正确。我使用
ffplay -video_size 1280x720 -pixel_format yuv420p -f rawvideo out.yuv
. 播放 .yuv 文件
错误代码以十六进制打印,错误代码0x301和0x31c是“decoder/impeg2d.h”中定义的枚举常量
IMPEG2D_UNKNOWN_ERROR
和IMPEG2D_INVALID_PIC_TYPE
的值:
typedef enum
{
IMPEG2D_UNKNOWN_ERROR = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 1,
更多常数如下……
这是枚举中的第 28 个常量:
IMPEG2D_INVALID_PIC_TYPE,
更多常数如下……
} IMPEG2D_ERROR_CODES_T;
IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS
是“decoder/ivd.h”中定义的枚举常量:
IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS = 0x300,
所以:
IMPEG2D_UNKNOWN_ERROR
= 0x301IMPEG2D_INVALID_PIC_TYPE
= 0x31c