2024-12-09 2025-02-21 音视频 核心代码 找其中一个源文件的音频流 1234567891011121314151617for(int i = 0; i < ifmt1->nb_streams; i++){ AVStream *instream1 = ifmt1->streams[i]; AVStream *outstream = NULL; AVCodecParameters *inCodecPar1 = instream1->codecpar; if(inCodecPar1->codec_type == AVMEDIA_TYPE_AUDIO){ outstream = avformat_new_stream(ofmt, NULL); if(!outstream){ av_log(NULL, AV_LOG_ERROR, "创建流失败!"); goto __ERROR; } avcodec_parameters_copy(outstream->codecpar, instream1->codecpar); outstream->codecpar->codec_tag = 0; aidx = i; aidx1 = cnt++; }} 找另一个源文件的视频流 1234567891011121314151617for(int i = 0; i < ifmt2->nb_streams; i++){ AVStream *instream2 = ifmt2->streams[i]; AVStream *outstream = NULL; AVCodecParameters *inCodecPar2 = instream2->codecpar; if(inCodecPar2->codec_type == AVMEDIA_TYPE_VIDEO){ outstream = avformat_new_stream(ofmt, NULL); if(!outstream){ av_log(NULL, AV_LOG_ERROR, "创建流失败!"); goto __ERROR; } avcodec_parameters_copy(outstream->codecpar, instream2->codecpar); outstream->codecpar->codec_tag = 0; vidx = i; vidx1 = cnt++; }} 读取源文件并写入到目标文件 12345678910111213141516while(av_read_frame(ifmt1, &pkt1) >= 0 || av_read_frame(ifmt2, &pkt2) >= 0){ if(pkt1.stream_index == aidx){ pkt1.pts = av_rescale_q_rnd(pkt1.pts, ifmt1->streams[aidx]->time_base, ofmt->streams[aidx1]->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); pkt1.dts = pkt1.pts; pkt1.stream_index = aidx1; av_interleaved_write_frame(ofmt, &pkt1); av_packet_unref(&pkt1); } if(pkt2.stream_index == vidx){ pkt2.pts = av_rescale_q_rnd(pkt2.pts, ifmt2->streams[vidx]->time_base, ofmt->streams[vidx1]->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); pkt2.dts = av_rescale_q_rnd(pkt2.dts, ifmt2->streams[vidx]->time_base, ofmt->streams[vidx1]->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); pkt2.stream_index = vidx1; av_interleaved_write_frame(ofmt, &pkt2); av_packet_unref(&pkt2); }} 前一篇 Cloudflare证书到底是怎样 后一篇 实现FFmpeg的裁剪
说些什么吧!