使用ffmpeg+opencv播放ts格式的视频
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格式的视频相关推荐
- c++ DirectShow播放任意格式的视频
利用opencv只能处理.avi的视频,opencv之前的版本之前试过好像是只能处理.avi未压缩版本的视频,未压缩过的视频相当大,一个文件大概是几十个G.(这个不确定,因为之前用的压缩过的.avi的 ...
- 如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi格式的视频
如何使用JiaoZiVideoPlayer(饺子视频播放器)播放avi等原生不支持的格式的视频 1.为什么使用JiaoZiVideoPlayer播放AVI格式的视频 有的同学可能会发现,部分.avi文 ...
- vue使用原生videojs 播放m3u8格式的视频——播放m3u8格式视频(一)
vue使用原生video播放m3u8格式的视频 1.安装依赖 2.页面引入插件(这里我是页面单独引入,减少项目体积) 3.页面中的使用 常见问题 4.实现过程 5.实现.m3u8格式视频播放方法 1. ...
- HLS播放:html5下用video标签来播放m3u8格式的视频
HLS播放:html5下用video标签来播放m3u8格式的视频 <video class="tvhou" width="100%" height=&qu ...
- x265探索与研究(三):如何播放*.265格式的视频或解码视频流
如何播放*.265格式的视频或解码视频流 如下图,在得到.265格式的视频或视频流后应如何播放265格式的视频呢?本博文总结出5种播放265格式视频或视频流的基本方法. 方式一:Elecard HEV ...
- 关于在asp.net中播放MP4格式的视频(好吧,只兼容支持html5的浏览器,ie8及以下的都歇菜了)...
项目要求只能播放MP4格式的视频,同事的播放器在我这里不完全管用,对于部分mp4格式的视频编码不支持,所以各种在网上找,在http://www.iteye.com/problems/75503问答的一 ...
- vue中使用video-player 播放rtmp格式的视频,播放前有一小段黑屏
问题: 在vue项目中使用video-player 播放rtsp格式的视频的时候, 若视频渲染比较慢的时候, 会导致初始画面是黑屏的状态. 解决思路:监听播放状态,等数据加载完,页面可以渲染的时候 再 ...
- iphone php格式视频播放,iPhone能播放什么格式的视频 支持视频格式
[巴士数码]一些新手用户可能还不清楚iPhone能播放什么格式的视频,下面我们就来详细介绍一下iPhone6播放视频格式.iPhone6屏幕变大了,观看视频时自然拥有更好的视觉效果,不过在此之前,我们 ...
- 让Media Player播放 rmvb格式的视频
相信大家都是要看电影的(废话),而我们一般的电影都是rmvb格式的电影,而由于门户之别,Windows media player 12,是不支持播放这种格式的视频的,难道就为了这种格式的文件而放弃华丽 ...
- PPT2003播放多种格式的视频的方法ppt模板制作
一般情况,我们在PowerPoint2003中插入视频文件的方法都是点击菜单栏--插入,然后把本地视频上传进去.不过这样的方法也不全面,有些格式的 灰雀ppt课件视频传上去并不能播放.下面,我教大家利 ...
最新文章
- 杂题 NOIP2016蚯蚓
- DRV8711总是报Pre-driver fault错误原因与处理方法
- 3.2-3.3 Hive中常见的数据压缩
- 大四报了个天价培训班,变成量产型炮灰工程师
- EhCache复制:RMI与JGroups
- python语法基础题你好_Python基础要打牢,先学会基本语法
- hbase shell查询表中某字段不为空的数据量_HBase工作原理
- fastjson.JSONObject之对象与JSON转换方法
- python进程池和线程池_python自带的进程池及线程池
- Java23种设计模式(一)
- 怎么使用java初始化链表_Java链表基本操作和Java.util.ArrayList
- 单片机小车电机运转不起来
- 喜大普奔!ios原生键盘终于支持自然码双拼了!
- 灵遁者诗歌集《笔有千钧》下集,魔幻与现实,都很美
- mysql入门 博客园_FreeSql (一)入门 – FreeSql – 博客园
- 4个易打动人的营销技巧
- 浏览器/html/css面试题
- LINUX:Ubuntu重装虚拟机后无法拖拽文件的解决方法
- vue 基于elementUI、sortablejs的表格拖拽排序
- 【调试】——idea远程调试服务器上的代码