3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com
ffplay分析(视频解码线程操作(版本: ffmpeg-4.2.1 )一、分析: 1、stream_component_open ) :视频解码线程视频_ thread video_open ) :打开视频解码: get_video_frame (调用解码完成的一帧数据4,get_video_frame ):decoder _ ddeo _ frame decoder_decoder ) )得到的decoder _ decode _ frame (:av codec _ receive _ frame ) )取得的结果是否恢复正常,还是退出循环7, 从decoder_decode_frame(:Packet )解码前)队列中更新的Packet8、decoder_decode_frame ) :判断获取的packet是否为flush Packet9 get_video_frame )和decoder_decode_frame ),获得解码后的一帧的数据,然后判断是否需要drop帧11和vided帧调用queue_picture (frame (解码后)队列12,queue _ picture ):frame_queue_peek_writable ) )的相应参数通过调用queue_picture ():av_Frame_move_ref )移动AVFrame-buffer,通过调用frame_queue_push ) (frame ) )
2、初始化video_thread(:timebase和framerate的操作
3、调用video_thread(:get_video_frame ) )获得已解码的1帧的数据
4、调用get _ video _ frame (:decoder _ decode _ frame ),获得解码后的1帧的数据
5、循环调用decoder _ decode _ frame (:av codec _ receive _ frame ) )获取解码后的帧数据
6、decoder _ decode _ frame (:av codec _ receive _ frame ) ) )获得的结果,判断是恢复正常还是退出循环向下移动
7、decoder_decode_frame ) :从Packet (解码前)队列获取新Packet
8、decoder_decode_frame (:判断获取的包是否为flush包
9,调用decoder _ decode _ frame (:av codec _ send _ packet ) )进行解码
10、调用get _ video _ frame (:decoder _ decode _ frame ),获得解码后的一帧的数据,然后判断是否需要drop帧
11、调用video_thread(:get_video_Frame ) )得到已解码的一帧数据后,计算该帧的pts/duration,并返回queue_picture )
12、调用queue _ picture (:frame _ queue _ peek _ writable ) )获取可写帧,并设置相应的参数
13、调用queue _ picture (:av _ frame _ move _ ref ) )移动AVFrame-buffer,调用frame_queue_push ) )进行frame )
14、video_thread () :视频解码线程退出处理,除非要求退出或异常退出。