参考链接:《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频_雷霄骅(leixiaohua1020)的专栏-CSDN博客_雷霄骅ffmpeg视频教程

如有不详细之处可以观看雷神视频讲解,相关资源可前往下方链接免费下载,如果链接失效可直接微博留言(3条消息) 雷霄骅——FFmpeg视频解码器-讲义文档类资源-CSDN文库

▫ av_register_all():注册所有组件。
▫ avformat_open_input():打开输入视频文件。
▫ avformat_find_stream_info():获取视频文件信息。
▫ avcodec_find_decoder():查找解码器。
▫ avcodec_open2():打开解码器。
▫ av_read_frame():从输入文件读取一帧压缩数据。
▫ avcodec_decode_video2():解码一帧压缩数据。
▫ avcodec_close():关闭解码器。
▫ avformat_close_input():关闭输入视频文件。

先附上相关代码以及注释:

#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;#define __STDC_CONSTANT_MACROSextern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
};int main(int argc, char* argv[])
{AVFormatContext    *pFormatCtx;        //定义结构体指针int                i, videoindex;AVCodecContext    *pCodecCtx;AVCodec          *pCodec;AVFrame *pFrame,*pFrameYUV;uint8_t *out_buffer;AVPacket *packet;int y_size;int ret, got_picture;struct SwsContext *img_convert_ctx;//输入文件路径char filepath[]="Titanic.ts";int frame_cnt;av_register_all();             //初始化组件avformat_network_init();     //初始化网络连接pFormatCtx = avformat_alloc_context();//打开输入视频文件if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){printf("Couldn't open input stream.\n");return -1;}//获取流信息if(avformat_find_stream_info(pFormatCtx,NULL)<0){printf("Couldn't find stream information.\n");return -1;}videoindex=-1;for(i=0; i<pFormatCtx->nb_streams; i++)  //nb_streams:输入视频的AVStream 个数if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){  //streams:输入视频的AVStream []数组videoindex=i; //判断文件是视频流还是音频流,把其中的视频流获取出来break;}if(videoindex==-1){printf("Didn't find a video stream.\n");return -1;}pCodecCtx=pFormatCtx->streams[videoindex]->codec;   pCodec=avcodec_find_decoder(pCodecCtx->codec_id);  //获取解码器if(pCodec==NULL){printf("Codec not found.\n");return -1;}if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){  //打开解码器 printf("Could not open codec.\n");return -1;}/** 在此处添加输出视频信息的代码* 取自于pFormatCtx,使用fprintf()*///FILE* fp = fopen("info.txt", "wb+");ofstream fout("info.txt");fout << "时长为:" << pFormatCtx->duration << " 毫秒" << endl;fout << "封装格式为: " << pFormatCtx->iformat->name <<endl;fout << "视频帧的宽为:" << pCodecCtx->width  << "  视频帧的高为: "<< pCodecCtx->height <<endl;fout << "视频帧的宽为:" << pFormatCtx->streams[videoindex]->codec->width << "  视频帧的高为: " << pFormatCtx->streams[videoindex]->codec->height << endl;fout.close();//fclose(fp);//printf("时长:%d", pFormatCtx->duration);pFrame=av_frame_alloc();pFrameYUV=av_frame_alloc();out_buffer=(uint8_t *)av_malloc(avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height));avpicture_fill((AVPicture *)pFrameYUV, out_buffer, PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);packet=(AVPacket *)av_malloc(sizeof(AVPacket));//Output Info-----------------------------printf("--------------- File Information ----------------\n");av_dump_format(pFormatCtx,0,filepath,0);printf("-------------------------------------------------\n");img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); FILE* fp_264 = fopen("test264.h264", "wb+");FILE* fp_yuv = fopen("testyuv.yuv", "wb+");frame_cnt=0;while(av_read_frame(pFormatCtx, packet)>=0){ //读取帧if(packet->stream_index==videoindex){ //判断是不是视频帧/** 在此处添加输出H264码流的代码* 取自于packet,使用fwrite()*/fwrite(packet->data, 1, packet->size, fp_264);ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);if(ret < 0){printf("Decode Error.\n");return -1;}if(got_picture){sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);printf("Decoded frame index: %d\n",frame_cnt);/** 在此处添加输出YUV的代码* 取自于pFrameYUV,使用fwrite()*/fwrite(pFrameYUV->data[0], 1, (pCodecCtx->width)*(pCodecCtx->height), fp_yuv);fwrite(pFrameYUV->data[1], 1, (pCodecCtx->width) * (pCodecCtx->height) / 4, fp_yuv);fwrite(pFrameYUV->data[2], 1, (pCodecCtx->width) * (pCodecCtx->height) / 4, fp_yuv);frame_cnt++;}}av_free_packet(packet);}fclose(fp_264);fclose(fp_yuv);sws_freeContext(img_convert_ctx);av_frame_free(&pFrameYUV);av_frame_free(&pFrame);avcodec_close(pCodecCtx);avformat_close_input(&pFormatCtx);return 0;
}

最简单的基于FFmpeg的解码器相关推荐

  1. 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  2. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  3. 最简单的基于FFMPEG的Helloworld程序

    学习雷神的FFMPEG入门教程,本文基于命令行实现. 文件结构 G:\Coding\FFMpeg\Proj\Console>dir驱动器 G 中的卷没有标签.卷的序列号是 0FD5-0CC8G: ...

  4. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  5. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  6. 最简单的基于FFmpeg的移动端例子:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  7. 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  8. 最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  9. 最简单的基于FFMPEG+SDL的音频播放器 拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

最新文章

  1. CPU/GPU/TPU/NPU...XPU都是什么意思?
  2. linux按文件名排序ls,linux – 如何使用shell脚本按名称对文件进行排序
  3. 利用位运算和指针实现的交换两个数的程序
  4. 【Flutter】Dart 面向对象 ( 抽象类 | 抽象方法 )
  5. QT5.14 VS2019
  6. html表单复选框样式,美化表单——自定义checkbox和radio样式
  7. mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码
  8. 如何定义 Java 中的方法
  9. revit对齐命令选不中_如何利用无人机+Photoscan+Revit完成土方计算
  10. 【vue】vue +element 搭建项目,要求既支持pc端又支持移动端
  11. java mysql dump_mysql dump备份和恢复
  12. NLP算法岗面经 | 微软/腾讯/字节跳动/快手
  13. Java到底如何更优雅的处理空值?
  14. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_01-自定义查询页面-服务端-Dao...
  15. centOS7中使用Nginx部署静态网页
  16. 独家干货|基于大数据的人体组织微结构的解析与构建
  17. 免费还能商用的视频素材,拿走不谢。
  18. 发布uubox.net客户端工具及其源代码
  19. 练习 P1957 口算练习题
  20. win10目标文件夹访问被拒绝怎么办

热门文章

  1. Windows10下CUDA与cuDNN的安装
  2. 做一名开源社区的扫地僧
  3. 还在手动换IP?大佬们都这样做
  4. 第一次用示波器怎么使用(基础经验)
  5. c语言程序延时10s,单片机C语言程序设计:10s 的秒表
  6. vim quickfix——最灵活的quickfix
  7. 黑色沙漠 无法使用未完成的文字
  8. Jess的各种小问题
  9. 解决Warning: Leaking Caffe2 thread-pool after fork
  10. 为什么我们总是这么急?