我正在尝试创建一个自定义 I/O 层以将原始 H.264 帧数据从 QUdpSocket 数据报传递给 FFMPEG。H.264 帧没有任何类型的容器,只是从帧抓取设备流式传输。出了点问题,因为由于某种原因,当我调用 avcodec_decode_video2() 时,FFMPEG 认为访问单元的大小为 1:
[h264 @ 0x1030dd000] missing picture in access unit with size 1
[h264 @ 0x1030dd000] no frame!
我的第一步是探测 AVInputFormat 的第一帧:
socket->readDatagram(datagram.data(), datagram.size());
AVProbeData probeData;
probeData.filename = udpUrl.toStdString().c_str();
probeData.buf_size = datagram.size() + AVPROBE_PADDING_SIZE;
probeData.buf = (unsigned char *)malloc(datagram.size() + AVPROBE_PADDING_SIZE);
memcpy(&probeData.buf[AVPROBE_PADDING_SIZE], datagram.data(), datagram.size());
inputFormat = av_probe_input_format(&probeData, 1);
接下来我分配一个AVIOContext:
buffer = (unsigned char *)malloc(bufferSize);
ioContext = avio_alloc_context(buffer, bufferSize, 0, socket, &readFrame, NULL, NULL);
之后我调用avformat_open_input_stream():
if (av_open_input_stream(&formatContext, ioContext, "", inputFormat, NULL) != 0)
这似乎成功返回。但是,视频流缺少重要信息,例如宽度、高度和像素格式,这会导致 av_find_stream_info() 失败。我可以手动设置这些参数,但它不会导致成功解码,这让我想知道我还缺少什么。
据我所知,NAL 单元完好无损:
First Frame
00:00:00:01:27:64:00:28:ad:84:09:26:6e:23:34:90:81:24:cd:c4:66:92:10:24:99:b8:8c:d2:42:04:93:37:11:9a:48:40:92:66:e2:33:49:08:12:4c:dc:46:69:21:05:5a:eb:d7:d7:e4:fe:bf:27:d7:ae:b5:50:82:ad:75:eb:eb:f2:7f:5f:93:eb:d7:5a:ab:40:50:1e:c8:
00:00:00:01:28:ee:3c:b0:
00:00:00:01:25:88:84:27:...
Second Frame
00:00:00:01:21:9a:59:15:...
我错过了 API 调用吗?谁能看到我可能做错了什么?