音视频同步-ffmpeg
音视频同步肯定是需要使用时间戳进行同步的,音频和视频的时间戳进行对比,哪个小就写入哪个包,基本上可以实现音视频同步。
但是这个时间戳从哪里来呢?
使用rtp头中携带的时间戳是最正确的方法,因为音视频流发出的时候,将时间戳写入到了rtp头中。不管网络是否有阻塞、丢帧等问题,使用此时间戳进行同步,最终生成的视频文件中音频和视频都是同步的,且视频长度也正常。在此记录一下
使用ffmpeg直接接收rtp视频和音频媒体流,再将rtp包中的时间戳转换一下,即可实现音视频同步;
从av_read_frame中 收到的视频帧,带的时间戳需要根据输出流的时间基准进行转换,每个包要显示的时长duration都是0,需要自己进行计算。计算法如下
if(av_read_frame(ifmt_ctx_v, &pkt) >=0)
{if (pkt.duration == 0 && ((pkt.pts - last_pts_v)>0)){pkt.duration = av_rescale_q((pkt.pts - last_pts_v), in_stream->time_base, ofmt_ctx->streams[stream_index]->time_base);}last_pts_v = pkt.pts;pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, ofmt_ctx->streams[stream_index]->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));pkt.dts = pkt.pts; pkt.pos = -1;printf("timebase convert after pkt.pts =%d\n",pkt.pts);printf("timebase convert after pkt.dts =%d\n",pkt.dts);printf("timebase convert after pkt.duration =%d\n",pkt.duration);printf("frame_index =%d\n",frame_index);if (frame_index == 0){frame_index++;p_pkt_last = av_packet_clone(&pkt);av_packet_unref(&pkt);printf("frame_index == 0 convert p_pkt_last->pts =%d\n",p_pkt_last->pts);printf("frame_index == 0 convert p_pkt_last->dts =%d\n",p_pkt_last->dts);printf("frame_index == 0 convert p_pkt_last->duration =%d\n",p_pkt_last->duration);continue;}else{frame_index++;p_pkt_last->duration = pkt.duration;printf("convert p_pkt_last->pts =%d\n",p_pkt_last->pts);printf("convert p_pkt_last->dts =%d\n",p_pkt_last->dts);printf("convert p_pkt_last->duration =%d\n",p_pkt_last->duration);nxt_pts_v = p_pkt_last->pts;ret = av_interleaved_write_frame(ofmt_ctx, p_pkt_last);av_packet_unref(p_pkt_last);p_pkt_last = NULL;p_pkt_last = av_packet_clone(&pkt);av_packet_unref(&pkt);continue;}
}
音视频同步-ffmpeg相关推荐
- 音视频同步 ffmpeg 推流
音视频同步原理及实现 可参考: https://blog.csdn.net/myvest/article/details/97416415 https://www.jianshu.com/p/3578 ...
- php音视频同步,FFMPEG转码音视频不同步情况总结
[导读]使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类. 使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同 ...
- FFmpeg 音视频同步
原地址:http://www.jianshu.com/p/27279255f67e 音视频播放器的工作的具体流程如下图所示: 播放器工作流程 简单的来说包括:解协议,解封装,对音频和视频分别进行解码, ...
- ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
## 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文 ...
- 音视频同步原理[ffmpeg]
音视频同步原理[ffmpeg] output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题. 阅读前希望大家先了解一下时间戳的概念. /* compu ...
- ffmpeg源码分析_ffmpeg音视频同步的几种策略
在前面的文章中,我们介绍了播放器的视频渲染及音频渲染的相关知识,这些都是单独进行的,一旦在现实开发中将视频及音频结合在一起播放就会出现音视频不同步的问题. 下面我们就来分析一下如何解决音视频同步的问题 ...
- NDK开发——FFmpeg实现视频转YUV、视频转RGB显示、音频转PCM、音频播放、音视频同步
项目演示 前提准备 编译FFmpeg+CMake并能运行,详细可见我博客 下载libyuv库并编译成libyuv.so库,用于实现转换RGB格式功能 FFmpeg库简介 avcodec:编解码,包含 ...
- ffmpeg录制桌面视频和系统内部声音(音视频同步)
本文抓取的是电脑内部声音,需要先安装软件screen capture recorder,这个软件大小有50M,太大,安装后,里面有一个脚本文件,如下所示: 打开这个文件,可以看到如下内容: 这个文件比 ...
- ffmpeg源码中ffplay音视频同步原理及实现
音视频指南 文章目录 音视频指南 前言 一.音视频同步简单介绍? 二.基本概念解释 1.为什么需要视频压缩 2.什么是I帧.p帧.b帧 3.什么是DTS,PTS 4.其他概念解释 三.常用同步策略 四 ...
最新文章
- Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源
- swift_014(Swift 的控制流)
- mysql锁3.常见问题
- 恭喜神策数据客户即刻完成 C 轮融资
- c 连接mysql示例 源码_MySQL 连接
- 漫步数理统计十一——连续随机变量(下)
- SQL Server使用sp_rename重命名约束注意事项
- 剑指 Offer 64. 求1+2+…+n(面试题中的短路与)
- c++ qt5范例开发大全_237页建设工程监理内业资料全套范例,附百份案例表格,快拿走...
- 【心电信号】基于matlab小波变换心电信号去噪【含Matlab源码 956期】
- weblogic部署静态资源文件html,weblogic部署静态html
- Web安全研究(一)
- 腾讯内部深度文章曝光:微信向左 手机QQ向右
- 信捷plc c 语言全局变量,三菱PLC编程中,跳转指令CJ、子程序调用CALL和中断指令有什么区别?...
- Win10系统antimalware service executable进程占用cpu过高的问题
- 竞斗云2.0刷机-编程器刷入opboot
- 前端LayUI框架快速上手详解(一)
- 有源电场与无源磁场与麦克斯韦方程
- PAT 乙级 1035 插入与归并
- AI智能语音机器人为什么会这么火爆