FFMPEG转码音视频不同步情况总结

本文详细分析了使用FFMPEG进行音视频转码时遇到的各种不同步问题及其解决方案,包括源本身的问题、时间戳问题、帧丢失、循环源与非单调时间戳等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 【后记】本篇是几年前还在从事流媒体时候的一篇笔记文,近来常有朋友问我目前的方向,经过几年的辗转,目前在计算机视觉AI方向落地生根。转方向需要持续的学习和突破,从流媒体转到人工智能也是一个需要时间的过程,所幸的是,自己从来没有放弃前进的步伐。在不断的摸索前进中,逐渐汲取更多的知识和能量,才能支撑我们走到更远更高的地方。前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享给想学习人工智能的你。点击跳转到网站

------------------------------------------------我是分割线--------------------------------------------------------------

使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类。

1. 源本身音视频不同步且无法播放

这种情况极为罕见,在A客户东方卫视频道转码时遇到过。

表现为输出的音视频严重不匹配,录制下来的视频源无法播放,要么只有声音没有图像,要么只有图像没有声音,且图像播放卡顿。

解决方案:转码器无法修复这种异常源,需要反馈给源提供方修复。

2. 源本身的时间戳问题,但源可正常播放

这种情况较少见,在M客户湖南卫视直播源时出现过。

表现为转码出来的视频图像播放正常,但是没有声音。录制下来的视频源能正常播放。

分析方法

int _tmain(int argc, _TCHAR* argv[]) { currentAudioClock = 0; currentVideoClock = 0; currentBufferClock = 0; //currentPlayClock=0; CurrentVolume = SDL_MIX_MAXVOLUME; if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError()); return 1; } SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); SDL_EventState(SDL_USEREVENT, SDL_IGNORE); atexit(SDL_Quit);// 注册SDL_Quit,当退出时调用,使得退出时程序自动清理 //flag=2; //给音视频队列分配空间 videoQueue = (VideoQueue *)av_mallocz(sizeof(VideoQueue)); audioQueue = (AudioQueue *)av_mallocz(sizeof(AudioQueue)); //初始化音视频队列 VideoQueueInit(videoQueue); AudioQueueInit(audioQueue); char* url = "G:/上海滩.mp4"; //char* url = "G:/2014年5月26日17 12 00至2014年5月26日17 14 59.avi"; //char* url = "H:/视频/不当交易.The.Unjust.BD.MiniSD-TLF.mkv"; //char* url = "E:/BaiduMusic/Songs/Love Story - Taylor Swift.mp3"; decodeTid = SDL_CreateThread(DecodePacket, "DecodePacket", (void*)url); PlayVideoTid = SDL_CreateThread(PlayVideo, "PlayVideo", NULL); PlayAudioTid = SDL_CreateThread(PlayAudio, "PlayAudioTid", NULL); int tid; SDL_WaitThread(decodeTid, &tid); printf("decodeTid %d\n", tid); SDL_WaitThread(PlayVideoTid, &tid); printf("PlayVideoTid %d\n", tid); SDL_WaitThread(PlayAudioTid, &tid); printf("PlayAudioTid %d\n", tid); SDL_DestroyMutex(audioQueue->audioMutex); SDL_DestroyCond(audioQueue->audioCond); SDL_DestroyMutex(videoQueue->videoMutex); SDL_DestroyCond(videoQueue->videoCond); av_free(videoQueue); av_free(audioQueue); return 0; }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值