好了,我们开始播放了。
对音视频有了解的朋友们应该都很清楚播放都思路和流程:
拿到音视频,要先解封装,然后解码,然后输出到设备。 输出区别一个是视频图像,一个是音频码流,如果里面有字幕流,还有个字幕机。
这就是音视频播放的全部流程。
涉及到再输出成音视频文件,还需要编码和写封装,这个后面研究到再说。
---------------接下来进入正题---------------
FFMPEG的解码
解码的第一步,将原始数据读入到内存
AVPacket *packet = av_packet_alloc();
for (;;) {
pthread_mutex_lock(&seek_mutex);
while (is_seek) {
LOGE("Player Log : produce waiting seek");
pthread_cond_wait(&seek_condition, &seek_mutex);
LOGE("Player Log : produce wake up seek");
}
pthread_mutex_unlock(&seek_mutex);
if (av_read_frame(player->format_context, packet) < 0) {
break;
}
packet = av_packet_alloc();
}
这里 packet 里面就是读到的原始数据了。
接下来就是需要解码
result = avcodec_send_packet(codec_context, packet);
if (result < 0 && result != AVERROR(EAGAIN) && result != AVERROR_EOF) {
av_packet_free(&packet);
continue;
}
result = avcodec_receive_frame(codec_context, frame);
if (result < 0 && result != AVERROR_EOF) {
av_packet_free(&packet);
continue;
}
frame里面就是能够直接播放的数据了,接下来就是把这些数据分类构建成能够直接输出的内容了。视频需要fps,码率等数据,音频需要采样率码率这些数据,然后再输出到对应到输出设备,就能播放了。
后面在细说这些以及音画同步等等的问题。