Ffmpeg 如何复制从av_read_帧接收的AVPicture。什么是正确的方法?

Ffmpeg 如何复制从av_read_帧接收的AVPicture。什么是正确的方法?,ffmpeg,streaming,video-streaming,sdl,sdl-2,Ffmpeg,Streaming,Video Streaming,Sdl,Sdl 2,我一直在尝试用android编写一个rtsp播放器。我是新手。并想知道如何存储从av_read_帧检索到的数据包以供进一步使用。 [例如,不同的线程来解码它 while (1) { av_read_frame(pFormatCtx, &packet) >= 0) { if (packet.stream_index == videoStream) { sendPacketToLInkedList ( packet); } sendPacket

我一直在尝试用android编写一个rtsp播放器。我是新手。并想知道如何存储从av_read_帧检索到的数据包以供进一步使用。 [例如,不同的线程来解码它

while (1)
{

av_read_frame(pFormatCtx, &packet) >= 0) {

if (packet.stream_index == videoStream) {
           sendPacketToLInkedList ( packet);
   }  



sendPacketToLinkedList (AVPacket *pkt)
{

  AVPacket *refPacket;
  refPacket = pkt;    //  How log will it be valid ??
}
我只是想知道从av_read_帧检索到的数据包有效期有多长?。

ffmpeg实际上有一些:

int-av\u-read\u帧(AVFormatContext*s,AVPacket*pkt)

如果pkt->buf为空,则数据包在下一个av_read_frame()或avformat_close_input()之前有效。否则,数据包将无限期有效。在这两种情况下,当不再需要数据包时,必须使用av_free_数据包释放数据包。对于视频,数据包只包含一帧。对于音频,如果每个帧具有已知的固定大小(例如PCM或ADPCM数据),则它包含整数个帧。如果音频帧具有可变大小(例如,MPEG音频),则它包含一个帧


如果您想要
av\u read\u frame()
-分配的
AVPacket
s在周围停留更长时间,总会有。

谢谢您的回复。如果pkt->buf,您的意思是在执行av_读取_帧之后?还是以前?所以如果pkt buf为NULL,那么我们需要执行av_copy_packet(),否则,我不需要复制,对吗?如果我错了,请纠正我?据我所知,如果
pkt->buf
av\u read\u frame()
之前是
NULL
(即,您只需
memset()
ted分配的堆栈
AVPacket
),您需要
av\u copy\u packet()