Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can make you of the same context there is no need for two separate context. If you are encoding both video and audio. Then you will first need to create video stream and then audio stream. However if you want to just encode only audio then you will need to create just audio stream. if(pkt.stream_index ==st->index) is normally required when you are transcoding i.e when you are change container format. In which can you will be reading frame from a video file and write to another file, so you need to know if the frame is from audio or video stream. However if you are getting decoded audio packets then you will need to set proper stream index in audio packet before do av_interleaved_write. </p> <p>In your code you are not setting pts and dts of audio packets which are required for proper encoding.</p> <p>Sometime ago I've written a similar program like your, you can look into it for your reference.</p> <pre><code>int VideoClipper::Init(const wxString&amp; filename) { int ret = 0; char errbuf[64]; av_register_all(); if ((ret = avformat_open_input( &amp;m_informat, filename.mb_str(), 0, 0)) != 0 ) { av_strerror(ret,errbuf,sizeof(errbuf)); PRINT_VAL("Not able to Open file;; ", errbuf) ret = -1; return ret; } else { PRINT_MSG("Opened File ") } if ((ret = avformat_find_stream_info(m_informat, 0))&lt; 0 ) { av_strerror(ret,errbuf,sizeof(errbuf)); PRINT_VAL("Not Able to find stream info:: ", errbuf) ret = -1; return ret; } else { PRINT_MSG("Got stream Info ") } for(unsigned int i = 0; i&lt;m_informat-&gt;nb_streams; i++) { if(m_informat-&gt;streams[i]-&gt;codec-&gt;codec_type == AVMEDIA_TYPE_VIDEO) { PRINT_MSG("Found Video Stream ") m_in_vid_strm_idx = i; m_in_vid_strm = m_informat-&gt;streams[i]; } if(m_informat-&gt;streams[i]-&gt;codec-&gt;codec_type == AVMEDIA_TYPE_AUDIO) { PRINT_MSG("Found Audio Stream ") m_in_aud_strm_idx = i; m_in_aud_strm = m_informat-&gt;streams[i]; } } if(m_in_aud_strm_idx == -1 &amp;&amp; m_in_vid_strm_idx == -1) { ret = -1; } if(m_informat-&gt;duration == AV_NOPTS_VALUE) { if(m_in_vid_strm_idx != -1 &amp;&amp; m_informat-&gt;streams[m_in_vid_strm_idx]) { if(m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;duration != AV_NOPTS_VALUE) { //m_in_end_time = (m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;duration)/(AV_TIME_BASE); m_in_end_time = (m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;duration)/(m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;time_base.den/m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;time_base.num); } } else if(m_in_aud_strm_idx != -1 &amp;&amp; m_informat-&gt;streams[m_in_aud_strm_idx]) { if(m_informat-&gt;streams[m_in_aud_strm_idx]-&gt;duration != AV_NOPTS_VALUE) { m_in_end_time = (m_informat-&gt;streams[m_in_aud_strm_idx]-&gt;duration)/(AV_TIME_BASE); } } } else { m_in_end_time = (m_informat-&gt;duration)/(AV_TIME_BASE); } if(m_in_vid_strm_idx != -1 &amp;&amp; m_informat-&gt;streams[m_in_vid_strm_idx]) { if(m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;r_frame_rate.num != AV_NOPTS_VALUE &amp;&amp; m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;r_frame_rate.den != 0) { m_fps = (m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;r_frame_rate.num)/ (m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;r_frame_rate.den); } } else { m_fps = 25; } AVOutputFormat *outfmt = NULL; std::string outfile = std::string(filename) + "clip_out.avi"; outfmt = av_guess_format(NULL,outfile.c_str(),NULL); if(outfmt == NULL) { ret = -1; return ret; } else { m_outformat = avformat_alloc_context(); if(m_outformat) { m_outformat-&gt;oformat = outfmt; _snprintf(m_outformat-&gt;filename, sizeof(m_outformat-&gt;filename), "%s", outfile.c_str()); } else { ret = -1; return ret; } } AVCodec *out_vid_codec,*out_aud_codec; out_vid_codec = out_aud_codec = NULL; if(outfmt-&gt;video_codec != AV_CODEC_ID_NONE &amp;&amp; m_in_vid_strm != NULL) { out_vid_codec = avcodec_find_encoder(outfmt-&gt;video_codec); if(NULL == out_vid_codec) { PRINT_MSG("Could Not Find Vid Encoder") ret = -1; return ret; } else { PRINT_MSG("Found Out Vid Encoder ") m_out_vid_strm = avformat_new_stream(m_outformat, out_vid_codec); if(NULL == m_out_vid_strm) { PRINT_MSG("Failed to Allocate Output Vid Strm ") ret = -1; return ret; } else { PRINT_MSG("Allocated Video Stream ") if(avcodec_copy_context(m_out_vid_strm-&gt;codec, m_informat-&gt;streams[m_in_vid_strm_idx]-&gt;codec) != 0) { PRINT_MSG("Failed to Copy Context ") ret = -1; return ret; } else { m_out_vid_strm-&gt;sample_aspect_ratio.den = m_out_vid_strm-&gt;codec-&gt;sample_aspect_ratio.den; m_out_vid_strm-&gt;sample_aspect_ratio.num = m_in_vid_strm-&gt;codec-&gt;sample_aspect_ratio.num; PRINT_MSG("Copied Context ") m_out_vid_strm-&gt;codec-&gt;codec_id = m_in_vid_strm-&gt;codec-&gt;codec_id; m_out_vid_strm-&gt;codec-&gt;time_base.num = 1; m_out_vid_strm-&gt;codec-&gt;time_base.den = m_fps*(m_in_vid_strm-&gt;codec-&gt;ticks_per_frame); m_out_vid_strm-&gt;time_base.num = 1; m_out_vid_strm-&gt;time_base.den = 1000; m_out_vid_strm-&gt;r_frame_rate.num = m_fps; m_out_vid_strm-&gt;r_frame_rate.den = 1; m_out_vid_strm-&gt;avg_frame_rate.den = 1; m_out_vid_strm-&gt;avg_frame_rate.num = m_fps; m_out_vid_strm-&gt;duration = (m_out_end_time - m_out_start_time)*1000; } } } } if(outfmt-&gt;audio_codec != AV_CODEC_ID_NONE &amp;&amp; m_in_aud_strm != NULL) { out_aud_codec = avcodec_find_encoder(outfmt-&gt;audio_codec); if(NULL == out_aud_codec) { PRINT_MSG("Could Not Find Out Aud Encoder ") ret = -1; return ret; } else { PRINT_MSG("Found Out Aud Encoder ") m_out_aud_strm = avformat_new_stream(m_outformat, out_aud_codec); if(NULL == m_out_aud_strm) { PRINT_MSG("Failed to Allocate Out Vid Strm ") ret = -1; return ret; } else { if(avcodec_copy_context(m_out_aud_strm-&gt;codec, m_informat-&gt;streams[m_in_aud_strm_idx]-&gt;codec) != 0) { PRINT_MSG("Failed to Copy Context ") ret = -1; return ret; } else { PRINT_MSG("Copied Context ") m_out_aud_strm-&gt;codec-&gt;codec_id = m_in_aud_strm-&gt;codec-&gt;codec_id; m_out_aud_strm-&gt;codec-&gt;codec_tag = 0; m_out_aud_strm-&gt;pts = m_in_aud_strm-&gt;pts; m_out_aud_strm-&gt;duration = m_in_aud_strm-&gt;duration; m_out_aud_strm-&gt;time_base.num = m_in_aud_strm-&gt;time_base.num; m_out_aud_strm-&gt;time_base.den = m_in_aud_strm-&gt;time_base.den; } } } } if (!(outfmt-&gt;flags &amp; AVFMT_NOFILE)) { if (avio_open2(&amp;m_outformat-&gt;pb, outfile.c_str(), AVIO_FLAG_WRITE,NULL, NULL) &lt; 0) { PRINT_VAL("Could Not Open File ", outfile) ret = -1; return ret; } } /* Write the stream header, if any. */ if (avformat_write_header(m_outformat, NULL) &lt; 0) { PRINT_VAL("Error Occurred While Writing Header ", outfile) ret = -1; return ret; } else { PRINT_MSG("Written Output header ") m_init_done = true; } return ret; } int VideoClipper::GenerateClip(void) { AVPacket pkt, outpkt; int aud_pts = 0, vid_pts = 0, aud_dts = 0, vid_dts = 0; int last_vid_pts = 0; if(m_good_clip) { SeekFrame(); while(av_read_frame(m_informat, &amp;pkt) &gt;= 0 &amp;&amp; (m_num_frames-- &gt; 0)) { if(pkt.stream_index == m_in_vid_strm_idx) { PRINT_VAL("ACTUAL VID Pkt PTS ",av_rescale_q(pkt.pts,m_in_vid_strm-&gt;time_base, m_in_vid_strm-&gt;codec-&gt;time_base)) PRINT_VAL("ACTUAL VID Pkt DTS ", av_rescale_q(pkt.dts, m_in_vid_strm-&gt;time_base, m_in_vid_strm-&gt;codec-&gt;time_base )) av_init_packet(&amp;outpkt); if(pkt.pts != AV_NOPTS_VALUE) { if(last_vid_pts == vid_pts) { vid_pts++; last_vid_pts = vid_pts; } outpkt.pts = vid_pts; PRINT_VAL("ReScaled VID Pts ", outpkt.pts) } else { outpkt.pts = AV_NOPTS_VALUE; } if(pkt.dts == AV_NOPTS_VALUE) { outpkt.dts = AV_NOPTS_VALUE; } else { outpkt.dts = vid_pts; PRINT_VAL("ReScaled VID Dts ", outpkt.dts) PRINT_MSG("=======================================") } outpkt.data = pkt.data; outpkt.size = pkt.size; outpkt.stream_index = pkt.stream_index; outpkt.flags |= AV_PKT_FLAG_KEY; last_vid_pts = vid_pts; if(av_interleaved_write_frame(m_outformat, &amp;outpkt) &lt; 0) { PRINT_MSG("Failed Video Write ") } else { m_out_vid_strm-&gt;codec-&gt;frame_number++; } av_free_packet(&amp;outpkt); av_free_packet(&amp;pkt); } else if(pkt.stream_index == m_in_aud_strm_idx) { PRINT_VAL("ACTUAL AUD Pkt PTS ", av_rescale_q(pkt.pts, m_in_aud_strm-&gt;time_base, m_in_aud_strm-&gt;codec-&gt;time_base)) PRINT_VAL("ACTUAL AUD Pkt DTS ", av_rescale_q(pkt.dts, m_in_aud_strm-&gt;time_base, m_in_aud_strm-&gt;codec-&gt;time_base)) //num_aud_pkt++; av_init_packet(&amp;outpkt); if(pkt.pts != AV_NOPTS_VALUE) { outpkt.pts = aud_pts; PRINT_VAL("ReScaled AUD PTS ", outpkt.pts) } else { outpkt.pts = AV_NOPTS_VALUE; } if(pkt.dts == AV_NOPTS_VALUE) { outpkt.dts = AV_NOPTS_VALUE; } else { outpkt.dts = aud_pts; PRINT_VAL("ReScaled AUD DTS ", outpkt.dts) PRINT_MSG("====================================") if( outpkt.pts &gt;= outpkt.dts) { outpkt.dts = outpkt.pts; } if(outpkt.dts == aud_dts) { outpkt.dts++; } if(outpkt.pts &lt; outpkt.dts) { outpkt.pts = outpkt.dts; aud_pts = outpkt.pts; } } outpkt.data = pkt.data; outpkt.size = pkt.size; outpkt.stream_index = pkt.stream_index; outpkt.flags |= AV_PKT_FLAG_KEY; vid_pts = aud_pts; aud_pts++; if(av_interleaved_write_frame(m_outformat, &amp;outpkt) &lt; 0) { PRINT_MSG("Faile Audio Write ") } else { m_out_aud_strm-&gt;codec-&gt;frame_number++; } av_free_packet(&amp;outpkt); av_free_packet(&amp;pkt); } else { PRINT_MSG("Got Unknown Pkt ") //num_unkwn_pkt++; } //num_total_pkt++; } av_write_trailer(m_outformat); av_free_packet(&amp;outpkt); av_free_packet(&amp;pkt); return 0; } return -1; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload