我试图创建一个定制的I/O层,将原始H.264帧数据从QUdpSocket数据报传递给FFMPEG。264帧没有任何类型的容器,只是简单地从帧抓取设备中流。有些地方出了问题,因为出于某种原因,FFMPEG认为当我调用avcodec_decode_video2()时,访问单元的大小为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调用吗?有人能看到我可能做错了什么吗?
发布于 2012-04-19 20:24:07
这只是猜测,但问题可能在于您使用的是UDP,而不是TCP。问题是UDP是不可靠的,数据包可能丢失,复制,或到达故障。而且数据包可能不对应于帧。所以你可能会得到零碎的帧和混淆的信息。我不认为那件事能处理得那么好。
维基百科:
UDP使用一个简单的传输模型,无需隐式握手对话,以提供可靠性、排序或数据完整性。因此,UDP提供了不可靠的服务,数据报可能会出现故障,出现复制,或在没有通知的情况下丢失。UDP假设错误检查和更正不是必要的,就是在应用程序中执行,从而避免了在网络接口级别进行此类处理的开销。
因此,也许您应该尝试使用TCP,看看它是否有效。TCP应该确保您准确地接收到您发送的内容,因此它不应该与将输出在本地传输到ffmpeg不同。
https://stackoverflow.com/questions/10221503
复制相似问题