1.环境:

Ubuntu 18.04

ffmpeg版本:

ffmpeg version N-103899-g855014ff83 Copyright (c) 2000-2021 the FFmpeg developersbuilt with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)configuration: --enable-gpl --enable-sharedlibavutil      57.  7.100 / 57.  7.100libavcodec     59.  9.101 / 59.  9.101libavformat    59.  5.100 / 59.  5.100libavdevice    59.  0.101 / 59.  0.101libavfilter     8.  9.100 /  8.  9.100libswscale      6.  1.100 /  6.  1.100libswresample   4.  0.100 /  4.  0.100libpostproc    56.  0.100 / 56.  0.100

2.代码:

从官方的例子decode_video.c和《最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)》--雷霄骅

参考编写的。解码出来的数据是YUV420的格式,对于没有安装opencv的可以写入到一个文件使用yuvplayer等工具查看,在代码的131行有。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#ifdef __cplusplus
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#ifdef __cplusplus
}
#endif#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace cv;int main(int argc, char **argv)
{const AVCodec *codec;AVCodecContext *c= NULL;AVFrame *frame;AVPacket *pkt;AVFormatContext *fmt_ctx = NULL;char *input_filename = NULL;int ret = 0;int w = 0, h = 0;uint8_t *fbuf;if (argc != 2) {fprintf(stderr, "usage: %s input_file\n""API example program to show how to read from a custom buffer ""accessed through AVIOContext.\n", argv[0]);exit(-1);}input_filename = argv[1];if (!(fmt_ctx = avformat_alloc_context())) {ret = AVERROR(ENOMEM);exit(-1);}ret = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL);if (ret < 0) {fprintf(stderr, "Could not open input\n");exit(-1);}ret = avformat_find_stream_info(fmt_ctx, NULL);if (ret < 0) {fprintf(stderr, "Could not find stream information\n");exit(-1);}int codecIndex = -1;for(int i=0; i<fmt_ctx->nb_streams; i++){if(fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){codecIndex = i;break;}}if(codecIndex == -1){perror("can not found codec");exit(-1);}{AVCodecParameters *cp = fmt_ctx->streams[codecIndex]->codecpar;w = cp->width;h = cp->height;printf("dec width=%d height=%d\n", w, h);fbuf = (uint8_t *)malloc(w*h*3/2);}av_dump_format(fmt_ctx, 0, input_filename, 0);pkt = av_packet_alloc();if (!pkt)exit(1);/* find the video decoder */codec = avcodec_find_decoder(\fmt_ctx->streams[codecIndex]->codecpar->codec_id);if (!codec) {fprintf(stderr, "Codec not found\n");exit(1);}c = avcodec_alloc_context3(codec);if (!c) {fprintf(stderr, "Could not allocate video codec context\n");exit(1);}/* open it */if (avcodec_open2(c, codec, NULL) < 0) {fprintf(stderr, "Could not open codec\n");exit(1);}frame = av_frame_alloc();if (!frame) {fprintf(stderr, "Could not allocate video frame\n");exit(1);}namedWindow("ts", WINDOW_NORMAL);resizeWindow("ts", 1280, 720);Mat src(Size(w, h*3/2), CV_8UC1, fbuf);Mat dst(Size(w, h), CV_8UC4);while(av_read_frame(fmt_ctx, pkt) >= 0){if(pkt->stream_index == codecIndex){ret = avcodec_send_packet(c, pkt);if (ret < 0) {fprintf(stderr, "Error sending a packet for decoding\n");exit(1);}while (ret >= 0) {ret = avcodec_receive_frame(c, frame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)break;else if (ret < 0) {fprintf(stderr, "Error during decoding\n");exit(1);}mempcpy(fbuf, frame->data[0], w*h);mempcpy(fbuf+w*h, frame->data[1], w*h/4);mempcpy(fbuf+w*h*5/4, frame->data[2], w*h/4);
#if 0if(frame->key_frame){FILE *f;f = fopen("py.yuv", "wb");fwrite(fbuf, w*h*3/2, 1, f);fclose(f);}
#elsecvtColor(src, dst, COLOR_YUV2BGRA_I420);imshow("ts", dst);waitKey(1);
#endif}}}avcodec_free_context(&c);av_frame_free(&frame);av_packet_free(&pkt);return 0;
}

3.运行结果

dec width=1920 height=1088
Input #0, mpegts, from './example1.ts':Duration: 00:02:00.00, start: 0.700000, bitrate: 12895 kb/sProgram 1 Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1088, 25.25 tbr, 90k tbn

使用ffmpeg+opencv播放ts格式的视频相关推荐

  1. c++ DirectShow播放任意格式的视频

    利用opencv只能处理.avi的视频,opencv之前的版本之前试过好像是只能处理.avi未压缩版本的视频,未压缩过的视频相当大,一个文件大概是几十个G.(这个不确定,因为之前用的压缩过的.avi的 ...

  2. 如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi格式的视频

    如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi等原生不支持的格式的视频 1.为什么使用JiaoZiVideoPlayer播放AVI格式的视频 有的同学可能会发现,部分.avi文 ...

  3. vue使用原生videojs 播放m3u8格式的视频——播放m3u8格式视频(一)

    vue使用原生video播放m3u8格式的视频 1.安装依赖 2.页面引入插件(这里我是页面单独引入,减少项目体积) 3.页面中的使用 常见问题 4.实现过程 5.实现.m3u8格式视频播放方法 1. ...

  4. HLS播放:html5下用video标签来播放m3u8格式的视频

    HLS播放:html5下用video标签来播放m3u8格式的视频 <video class="tvhou" width="100%" height=&qu ...

  5. x265探索与研究(三):如何播放*.265格式的视频或解码视频流

    如何播放*.265格式的视频或解码视频流 如下图,在得到.265格式的视频或视频流后应如何播放265格式的视频呢?本博文总结出5种播放265格式视频或视频流的基本方法. 方式一:Elecard HEV ...

  6. 关于在asp.net中播放MP4格式的视频(好吧,只兼容支持html5的浏览器,ie8及以下的都歇菜了)...

    项目要求只能播放MP4格式的视频,同事的播放器在我这里不完全管用,对于部分mp4格式的视频编码不支持,所以各种在网上找,在http://www.iteye.com/problems/75503问答的一 ...

  7. vue中使用video-player 播放rtmp格式的视频,播放前有一小段黑屏

    问题: 在vue项目中使用video-player 播放rtsp格式的视频的时候, 若视频渲染比较慢的时候, 会导致初始画面是黑屏的状态. 解决思路:监听播放状态,等数据加载完,页面可以渲染的时候 再 ...

  8. iphone php格式视频播放,iPhone能播放什么格式的视频 支持视频格式

    [巴士数码]一些新手用户可能还不清楚iPhone能播放什么格式的视频,下面我们就来详细介绍一下iPhone6播放视频格式.iPhone6屏幕变大了,观看视频时自然拥有更好的视觉效果,不过在此之前,我们 ...

  9. 让Media Player播放 rmvb格式的视频

    相信大家都是要看电影的(废话),而我们一般的电影都是rmvb格式的电影,而由于门户之别,Windows media player 12,是不支持播放这种格式的视频的,难道就为了这种格式的文件而放弃华丽 ...

  10. PPT2003播放多种格式的视频的方法ppt模板制作

    一般情况,我们在PowerPoint2003中插入视频文件的方法都是点击菜单栏--插入,然后把本地视频上传进去.不过这样的方法也不全面,有些格式的 灰雀ppt课件视频传上去并不能播放.下面,我教大家利 ...

最新文章

  1. 杂题 NOIP2016蚯蚓
  2. DRV8711总是报Pre-driver fault错误原因与处理方法
  3. 3.2-3.3 Hive中常见的数据压缩
  4. 大四报了个天价培训班,变成量产型炮灰工程师
  5. EhCache复制:RMI与JGroups
  6. python语法基础题你好_Python基础要打牢,先学会基本语法
  7. hbase shell查询表中某字段不为空的数据量_HBase工作原理
  8. fastjson.JSONObject之对象与JSON转换方法
  9. python进程池和线程池_python自带的进程池及线程池
  10. Java23种设计模式(一)
  11. 怎么使用java初始化链表_Java链表基本操作和Java.util.ArrayList
  12. 单片机小车电机运转不起来
  13. 喜大普奔!ios原生键盘终于支持自然码双拼了!
  14. 灵遁者诗歌集《笔有千钧》下集,魔幻与现实,都很美
  15. mysql入门 博客园_FreeSql (一)入门 – FreeSql – 博客园
  16. 4个易打动人的营销技巧
  17. 浏览器/html/css面试题
  18. LINUX:Ubuntu重装虚拟机后无法拖拽文件的解决方法
  19. vue 基于elementUI、sortablejs的表格拖拽排序
  20. 【调试】——idea远程调试服务器上的代码

热门文章

  1. 生不出孩子怪天气?驳《我国工业软件失去的30年》一文 | 凌云时刻
  2. Presto(即席查询)笔记
  3. 如何使用python进行社交网络分析
  4. 电脑桌面云便签怎么登录便签账号?
  5. Basler相机参数设置
  6. FPGA经典设计思想
  7. 开源wiki系统推荐wiki.js, github上16500+ star,是带数据库的
  8. 软件测试理论、方法及流程
  9. ubuntu如何更改IP地址
  10. PLC和变频器通讯方式