FFMPEG填坑之旅(叁----视频播放(一)数据解码)

465 阅读1分钟

好了,我们开始播放了。

对音视频有了解的朋友们应该都很清楚播放都思路和流程:

拿到音视频,要先解封装,然后解码,然后输出到设备。 输出区别一个是视频图像,一个是音频码流,如果里面有字幕流,还有个字幕机。

这就是音视频播放的全部流程。

涉及到再输出成音视频文件,还需要编码和写封装,这个后面研究到再说。

---------------接下来进入正题---------------

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,码率等数据,音频需要采样率码率这些数据,然后再输出到对应到输出设备,就能播放了。

后面在细说这些以及音画同步等等的问题。