该应用程序将相机输出保存为mov。文件,然后将其转换为AVPacket发送到rtmp服务器的flv格式。 它每次在两个文件之间切换,一个由摄像机输出写入,另一个是发送。 我的问题是音频/视频在一段时间后变得不同步。
发送的第一个缓冲区总是100%同步,但过了一段时间它就搞乱了。 我相信它的DTS-PTS问题..
if(isVideo)
{
packet->stream_index = VIDEO_STREAM;
packet->dts = packet->pts = videoPosition;
videoPosition += packet->duration = FLV_TIMEBASE * packet->duration * videoCodec->ticks_per_frame * videoCodec->time_base.num / videoCodec->time_base.den;
}
else
{
packet->stream_index = AUDIO_STREAM;
packet->dts = packet->pts = audioPosition;
audioPosition += packet->duration = FLV_TIMEBASE * packet->duration / audioRate;
//NSLog(@"audio position = %lld", audioPosition);
}
packet->pos = -1;
packet->convergence_duration = AV_NOPTS_VALUE;
// This sometimes fails without being a critical error, so no exception is raised
if((code = av_interleaved_write_frame(file, packet)))
{
NSLog(@"Streamer::Couldn't write frame");
}
av_free_packet(packet);
答案 0 :(得分:0)
您可以研究此示例:http://unick-soft.ru/art/files/ffmpegEncoder-vs2008.zip
但此示例适用于Windows。
在此示例中,我仅将pts用于音频流:
if (pVideoCodec->coded_frame->pts != AV_NOPTS_VALUE)
{
pkt.pts = av_rescale_q(pVideoCodec->coded_frame->pts,
pVideoCodec->time_base, pVideoStream->time_base);
}
答案 1 :(得分:0)
我在切换AVAssetWriters时遇到了类似的问题,并注意到如果我在获得视频样本时才开始使用新的AVAssetWriter,那么它就开始了
https://medium.com/@brandon.kobel/ios-seamless-video-chunks-4383a5a3a874