ffmpeg转码过程中的dts转换过程

本文聚焦于ffmpeg转码过程中的dts转换。介绍了转码流程,包括拉流、Avfilter的视频scale和音频重采样、编码后写数据Muxing。在各阶段,如拉流时需将网络数据timebase转成解码codec的timebase,avfilter操作前后及编码后muxing时,都要进行timebase转换。

ffmpeg转码过程中的dts转换过程

用ffmpeg api开发转码,在过程:拉流–>avfilter分辨率缩放,重采样–>编码–>写出,avpacket.dts和frame.dts在过程中需要根据不同的timebase进行转换。

一,拉流

在 av_read_frame后得到AVPacket packet


AVPacket packet;

int ret_i = av_read_frame(_format_ctx_p, &packet);

需要把网络数据输入的timebase转换成解码codec的timebase。


if(packet.stream_index == FRAME_TYPE_AUDIO) {
    av_packet_rescale_ts(&packet,
      _format_ctx_p->streams[_audio_index_i]->time_base,//1/1000
      _audio_codec_ctx_p->time_base);//1/48000
      _output_ptr->output_frame((void*)&packet, _audio_codec_ctx_p);
}
if(packet.stream_index == FRAME_TYPE_VIDEO) {
      av_packet_rescale_ts(&packet,
       _format_ctx_p->streams[_video_index_i]->time_base,//1/1000
       _video_codec_ctx_p->time_base);//1/25
       _output_ptr->output_frame((void*)&packet, _video_codec_ctx_p);
}

如果需要解码,也需要转换一下timebase:


new_frame_p->pts = av_rescale_q(new_frame_p->pts, _format_ctx_p->streams[_audio_index_i]->time_base, 
                        _audio_codec_ctx_p->time_base);
......
new_frame_p->pts = av_rescale_q(new_frame_p->pts, _format_ctx_p->streams[_video_index_i]->time_base, 
                        _video_codec_ctx_p->time_base);
注意:_video_codec_ctx_p和_audio_codec_ctx_p是解码的codec:

    _audio_stream_p = _format_ctx_p->streams[_audio_index_i];
    _audio_codec_ctx_p = _audio_stream_p->codec;
    _video_stream_p = _format_ctx_p->streams[_video_index_i];
    _video_codec_ctx_p = _video_stream_p->codec;

二. Avfilter的视频scale和音频重采样

在写入avfilter:av_buffersrc_add_frame_flags,和读取处理后的数据:av_buffersink_get_frame_flags,之后需要处理一下时间戳timebase转换。


AVRational vfilter_tb = _video_filter_ctx.buffersink_ctx->inputs[0]->timebase;
AVRational afilter_tb = _audio_filter_ctx.buffersink_ctx->inputs[0]->timebase;
......
if (视频)
    filtered_frame->pts = av_rescale_q(filtered_frame->pts, vfilter_tb, _vcodec_ctx_p->time_base);
if (音频)
    filtered_frame->pts = av_rescale_q(filtered_frame->pts, afilter_tb, _acodec_ctx_p->time_base);
然后在送去编码。

三. 编码后写数据Muxing

在编码后,把音视频avpacket进行muxing,需要进行timebase的转换:


if(视频)
    av_packet_rescale_ts(pkt_p, _vcodec_ctx_p->time_base, standard_ration);
if(音频)
    av_packet_rescale_ts(pkt_p, _acodec_ctx_p->time_base, standard_ration);
然后送去muxer写数据.
引用: FFmpeg是一个开源的多媒体框架,可以用来处理音频和视频文件。通过使用FFmpeg的接口,您可以创建一个简单的GUI来对媒体文件进行转码。这意味着您可以更改音频比特率、视频比特率、标量大小、帧率、音频通道和文件格式等参数。 要使用FFmpeg进行转码,您可以使用命令行工具或在代码中使用FFmpeg的接口。在命令行中,您可以使用类似于"ffmpeg -i input.flv -c:v mpeg2video -c:a mp2 output.ts"的命令进行转码。这个命令将输入文件input.flv转换成mpeg2video视频编码和mp2音频编码的输出文件output.ts。 如果您想在Node.js中使用FFmpeg的接口来创建一个简单的GUI进行转码,您可以使用FFmpeg的Node.js绑定。通过这个绑定,您可以在Node.js中调用FFmpeg的函数来进行转码。这样,您就可以自定义转码的参数并实现您所需的功能。 转码过程涉及到很多概念,比如nb_samples、frame_size、profile、ptsdts等等。这些概念可以通过参考相关文档和教程来深入了解。 总而言之,使用FFmpeg的接口可以让您在转码过程中灵活地控制参数并实现定制化的功能。您可以根据需要来选择使用命令行工具还是在代码中使用FFmpeg的接口进行转码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [FFmpeg编解码处理1-转码全流程简介](https://blog.youkuaiyun.com/weixin_34007886/article/details/94219062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [FFMPEG接口:在node.js中创建一个简单的GUI来对媒体文件进行转码](https://download.youkuaiyun.com/download/weixin_42121905/15298213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值