static int stream_has_enough_packets(AVStream *st, int stream_id, PacketQueue *queue) { return stream_id < 0 || queue->abort_request || (st->disposition & AV_DISPOSITION_ATTACHED_PIC) || queue->nb_packets > MIN_FRAMES && (!queue->duration || av_q2d(st->time_base) * queue->duration > 1.0); }
這是 ffplay.c 源碼中的一個函數,用於校驗是否有必要繼續向緩衝區中添加 AVPacket
。但是 「道理我都懂」,可是,st->disposition & AV_DISPOSITION_ATTACHED_PIC
是個什麼騷操做,爲何這個操做能夠決定是否有必要繼續向緩衝區中添加內容?html
【注:】你能夠直接跳過 化原 過程,直接到最後看結果。c++
果真,還真有介紹。連接在這:AV_DISPOSITION_ATTACHED_PICshell
The stream is stored in the file as an attached picture/"cover art" (e.g.
APIC frame in ID3v2). The first (usually only) packet associated with it will > be returned among the first few packets read from the file unless seeking > takes place. It can also be accessed at any time in AVStream.attached_pic.
好吧,感受只能意會不能言傳。json
它和mp3文件有關,是一個流的標誌。 -- 大佬less
ffprobe
仍是乖乖使用 ffprobe
查看文件的 streams
和 packets
信息吧。ide
查看 streams
函數
# 使用 ffprobe -show_streams -i quliulang.mp3 能夠查看更詳細的流信息 ffprobe -i quliulang.mp3
獲得了下面的結果:
能夠看到,一個 *.mp3 文件也能夠有 Video Stream
。是的,還能夠看到它的 codec type
是 png
。結合 查文檔 中給出的文檔的解釋,有沒有明白些什麼?再來看下 packets
。工具
查看 packets
spa
ffprobe -show_packets -of json -i quliulang.mp3 > packets.json
輸出結果以下:
.net
通過上述的分析,能夠獲得的結果是:AV_DISPOSITION_ATTACHED_PIC
是一個標誌。若是一個流中含有這個標誌的話,那麼就是說這個流是 *.mp3 文件中的一個 Video Stream
。而且該流只有一個 AVPacket
,也就是 attached_pic
。這個 AVPacket
中所存儲的內容就是這個 *.mp3 文件的封面圖片。
所以,也能夠很好的解釋了文章開頭提到的爲何 st->disposition & AV_DISPOSITION_ATTACHED_PIC
這個操做能夠決定是否能夠繼續向緩衝區中添加 AVPacket
。這裏能夠回答,是由於,若是這個流中包含這個標誌的話,說明這個流是 *.mp3 文件中的 Video Stream
。不是傳統意義上的視頻流。它只存放了封面信息,在播放或者導出時,不須要這個數據。所以咱們可使用這個標誌很好的區分這個特殊的 Video Stream
。而且經過判斷,屏蔽該流,不對其進行操做。