mp3
MPEG-1 or MPEG-2 Audio Layer III
ISO/IEC 13818-3 or ISO/IEC 11172-3
协议下载地址见前面.mp3
aac
AAC由国际标准化组织及国际电工委员会标准化为MPEG-2及MPEG-4规格的一部分。
.aac使用MPEG-2 Audio Transport Stream容器
MPEG-2 AAC和MPEG-4 AAC
ISO/IEC 13818-7 or ISO/IEC 14496-3 (HE-AAC/aac+)
13818-7下载地址 需要下载积分
14496-3下载地址 需要下载积分
h264
全称MPEG-4 Part 10, Advanced Video Coding,ISO/IEC 14496-10:2004
协议pdf下载地址 下载速度很慢,但是可以下载成功
mpeg2
ISO/IEC 13818-1 音视频同步与复用
13818-1中文版下载地址 需要下载积分
ISO/IEC 13818-2 视频
138181~3中文版下载地址 需要一个下载积分
13818-2英文版下载地址 需要下载积分
jpeg
协议ISO/IEC 10918-1 or ITU T.81
下载地址见前面.jpeg
ffmpeg
官网
Git仓库
WiKi
压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
bilibili网页播放器
flv.js Github仓库
bilibili苹果安卓播放器
ijkplayer Github仓库
ffserver
ffserver wiki地址
ffplay
ffplay 官网
使用the FFmpeg libraries and the SDL library。
MediaInfo查看媒体文件信息
官网
源码
参考资料
如何用ffplay播放视频
ISO/IEC 14496-12:2015(ISO格式) 官网可免费下载
ffplay read_thread获取文件信息流程
ffplay avformat_open_input解封装流程
ffplay probe探测文件格式流程
mp4文件格式详解
mkv文件格式详解
ffplay 视频显示流程
ffplay源码分析
// 获取文件封装格式
main() --> stream_open() --> read_thread() --> avformat_open_input() --> init_input()
--> av_probe_input_buffer2() --> av_probe_input_format2() --> av_probe_input_format3()
--> for(){ score = fmt1->read_probe() } // 选出封装格式,如mp4、mkv // AVInputFormat *fmt1
// mp4的read_probe() 是 mov_probe()
// 解封装,获取基础的流信息
main() --> stream_open() --> read_thread() --> avformat_open_input()
--> s->iformat->read_header(s) // 获取基本的流信息,如有多少音频和视频,音视频是什么格式
// mp4的read_header() 是 mov_read_header()
// 获取流里面的帧
--> ff_read_packet()
--> s->iformat->read_packet(s, pkt)
// mp4的read_packet() 是 mov_read_packet()
// 解码
AVCodec *codec
video_thread() --> get_video_frame() --> decoder_decode_frame() --> packet_queue_get() --> avcodec_receive_frame()
--> decode_receive_frame_internal() --> decode_simple_receive_frame() --> decode_simple_internal()
--> avctx->codec->decode()
ffmpeg/libavcodec/mpegaudiodec_float.c decode_frame()
ffmpeg/libavcodec/h264dec.c h264_decode_frame()
// 文件操作
//最终的读数据接口 url.h URLProtocol 将数据读到 AVIOContext
main() --> stream_open() --> read_thread() --> avformat_alloc_context()
--> avformat_get_context_defaults() --> io_open_default()
--> ffio_open_whitelist() --> ffurl_open_whitelist()
--> ffurl_connect() --> uc->prot->url_open()
//实际调用的地方是:
read_thread() --> avformat_open_input() --> init_input()
--> s->io_open()
//读取的数据放到AVIOContext中的buffer中
url_open = file_open, //file.c
ffurl_read() ffio_geturlcontext() AVIOContext中read_packet()
//数据流通过程
read_probe(AVProbeData.buf) <-- avio_read(AVIOContext.buf_ptr, 2k) <-- AVFormatContext.pb
//转码
main() --> transcode() --> transcode_step() --> process_input() --> process_input_packet()
--> do_streamcopy() --> output_packet() --> write_packet() --> av_interleaved_write_frame()
--> write_packets_common() --> write_packet_common() --> write_packet() --> ff_raw_write_packet()
--> avio_write() --> memcpy()
《H.264编码格式简单分析》
《【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一》
《H264码流和Mp4结构详解》
《H.264码流结构解析》
!!!《H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流》
!!!《MP4中提取H.264码流》
!!!《【VS开发】MP4与H.264》
《用ffmpeg从MP4中提取h.264码流》
《H264(NAL简介与I帧判断)》
《区分mp4格式里面mdat中的音频和视频数据》
!!!《MP4 mdat box解析》
测试视频下载
《Mpeg MP4 Container》
!!!《mp4所有box详解》
【多媒体封装格式详解】---MP4【4】
mp4文件格式解析
ffmpeg命令大全 (保存流)
Matroska文件解析之SimpleBlock
FFmpeg简易播放器的实现5-音视频同步
FFmpeg图解:结构体关系链接图
//打开文件
main() --> ffmpeg_parse_options() --> open_files() -->
--> open_input_file() --> avformat_open_input() --> AVFormatContext *ic
//处理流
--> choose_decoder() --> avformat_find_stream_info()
--> add_input_streams() --> transcode() --> transcode_step()
--> transcode_step() --> transcode_from_filter()
音视频同步
关于音视频同步 ffplay的同步方式解析
如何实现音视频同步 (live555)
播放器技术分享(3):音画同步
音视频同步原理及实现
即时通讯——详解音视频同步技术
音视频同步(播放)原理
WebRTC音视频同步详解
视频解码研究之PTS(2)Mp4格式,AVI格式和MKV格式
视频解码研究之PTS(1)TS格式和FLV格式
dts/pts在mp4文件的获取
mov.c
//dts的计算
mov_read_packet() --> dts = timestamp; mov_read_trak() --> mov_build_index() --> timestamp = current_dts{in stsc box}; current_dts += stts_data.duration{in stts box} -->
//需要调整的时候--> mov_fix_index() --> add_index_entry()
//pts的计算
//没有b帧时
pts = dts
//有b帧时
pts = dts + dts_shift + ctts_data.duration;
dts_shift: mov_update_dts_shift() --> ctts_duration{ctts box存放dts pts差值}
/* 音频播放流程 */
ffplay.c
main() --> stream_open() --> read_thread() --> stream_component_open() --> audio_open() --> sdl_audio_callback()
--> SDL_OpenAudioDevice() --> SDL_PauseAudioDevice()
/* 视频播放流程 */
main() --> event_loop() --> refresh_loop_wait_event() --> video_refresh() --> video_display() --> video_image_display()
mov.c
mp4解封装获取pkt->pts
decode.c
ff_decode_frame_props() frame->pts = pkt->pts;
decoder_decode_frame() -->
音频:frame->pts //这里的frame->pts和原始的mov.c中mp4的pkt->pts一致
视频:frame->pts
//获取Frame中af->pts(float,以秒为单位)
audio_thread() or video_thread()-->
af->pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb); //从累计数据量转换为时间轴实际秒数
//获取VideoState中的audio_clock
//=====================
struct Frame --> double af->pts; double duration; //实测为当前帧从0开始的相对秒数
audio_decode_frame() -->
struct VideoState --> double audio_clock; //实测为从零开始,当前帧播完时的相对秒数(浮点型,精确到毫秒)
is->audio_clock = af->pts + (double) af->frame->nb_samples / af->frame->sample_rate; //l2493
调整时间轴时间 //获取Clock中的pts
//======================
sdl_audio_callback() -->
set_clock_at(&is->audclk, ...) --> Clock audclk; --> .pts --> get form "is->audio_clock"
Sign in for post a comment
Comments ( 0 )