dtplayer开发问题总结

本文主要记录开发dtpalyer过程中遇到的各种问题及解决方法
Q1:ape文件pts计算不准
A:ape在demux的时候,会建立索引表,即index_entry,但pts的计算方式是递增blocksperframe,而不是按照每个包的实际的播放时间来设置的,因此在解码或者seek时计算pts的时候,需要转换,具体转换如下:
其中传入参数pts是从解码包pkt里都出来的pts
Q2:调用ffmpeg解码音频数据不对,感觉只有一个声道的数据
A:原因是很多视频格式默认解码出来的都是planar的,格式比较多的是AV_SAMPLT_FMT_S16P,需要转换成packeg格式的来播放,这里只需要将解码出来的格式统一转换成AV_SAMPLT_FMT_S16即可,ffmpeg提供了转换函数,比较简单。
Q3:调用ffmpeg解码视频pts计算不正确
A:发现从libavformat读出来的视频包,具体pts的递增数序如:1000,2000,3000...... 等,这里的处理方式是自己计算pts,将第一包数据的pts,拿出来后面按fps递增的顺序自己计算,问题解决。
Q4:mp3文件pts计算不准
这里mp3计算pts的时候,需要stream->time_base的参与,ffmpeg里面很多pts计算应该都是如下方式

Q5:SDL直接输出yuv

在ffmpeg的示例ffplay中通过sdl输出yuv数据时,由于source与dest的宽高等不同,需要使用sws_scale转换后才能正确显示。但对于直接开发播放器来讲,肯定不许要sdl还要依赖ffmpeg,因此最好是直接输出yuv,研究了一下发现可以按照如下方式解决

  
  
  
  
memcpy ( overlay -> pixels [ 0 ], pict -> data [ 0 ], dw * dh );
memcpy ( overlay -> pixels [ 1 ], pict -> data [ 2 ], dw * dh / 4 );
memcpy ( overlay -> pixels [ 2 ], pict -> data [ 1 ], dw * dh / 4 );
这里需要保证的是解码出来的yuv画面,已经scale到了dw dh的宽和高,否则会出现问题
具体可以参考dtplayer源码的dtvideo/video_out/vo_sdl.c的实现

Q6:Makefile
之前看ffmpeg,编译过程中只打印类似CC *.o等,非常精简。 dtplayer编译过程打印非常多,显的很乱,稍微研究了下ffmpeg的实现,发现思想也非常简单 即隐藏实际编译过程打印,但在编译每个目标文件之前,自己加打印,只打印自己想要的,示例如下:

%.o: %.c 	@echo CC $@ 
	@$(CC) $(CFLAGS) -c -o $@ $< 

Q7:添加SDL2支持,启动播放后不显示视频

原因是sdl2的SDL_CreateWindow以及SDL_RenderPresent等操作需要在同一个线程中,不用在主线程中,详细请参考dtplayer源码:dtvideo/video_out/vo_sdl2.c



你可能感兴趣的:(dtplayer开发问题总结)