(oVcc->coded_frame && oVcc->coded_frame->key_frame) pkt.flags |= PKT_FLAG_KEY; pkt.flags = packet.flags; pkt.stream_index= video_st->index; pkt.data= video_outbuf; pkt.size= out_size; ret=av_write_frame(oc, &pkt); } frame_index++; } else ret=av_write_frame(oc, &packet); if(ret!=0) { printf("while write video frame error\n"); exit(0); } } else if(packet.stream_index==audioindex) { len=packet.size; ptr=packet.data; int ret=0; while(len>0) { out_buf=NULL; out_size=0; if(&packet) samples=av_fast_realloc(samples,&samples_size,FFMAX(packet.size*sizeof(*samples),AVCODEC_MAX_AUDIO_FRAME_SIZE)); out_size=samples_size; ret=avcodec_decode_audio(aCodecCtx,samples,&out_size,ptr,len);if(ret<0) { printf("while decode audio failure\n"); exit(0); } fflush(stdout); ptr+=ret; len-=ret; if(out_size<=0) continue; out_buf=(uint8_t *)samples; AVPacket pkt; av_init_packet(&pkt); pkt.size= avcodec_encode_audio(oAcc, audio_outbuf, audio_outbuf_size, out_buf); pkt.pts= av_rescale_q(oAcc->coded_frame->pts, oAcc->time_base, audio_st->time_base); pkt.flags |= PKT_FLAG_KEY; pkt.stream_index= audioindex; pkt.data= audio_outbuf; if (av_write_frame(oc, &pkt) != 0) { fprintf(stderr, "Error while writing audio frame\n"); exit(1); } } } av_free_packet(&packet); } av_write_trailer(oc); for(i = 0; i < oc->nb_streams; i++) { av_freep(&oc->streams[i]->codec); av_freep(&oc->streams[i]); } url_fclose(oc); av_free(oc); av_free(oVFrame); av_free(out_buf); avcodec_close(vCodecCtx); avcodec_close(aCodecCtx); av_close_input_file(ic); }
(秩名) |