Streaming video (C# using FFmpeg AutoGen) sends multiple data requests

六眼飞鱼酱① 提交于 2019-12-23 18:53:27

问题


I've written a video generator that rights a video in h264 format (mp4). When I stream the video from my azure service, i'm seeing the following network traffic:

The AVCodecContext layout I'm using is as follows:

AVCodec* videoCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264)
AVCodecContext* videoCodecContext = ffmpeg.avcodec_alloc_context3(videoCodec);
videoCodecContext->bit_rate = 400000;
videoCodecContext->width = 1280;
videoCodecContext->height = 720;
videoCodecContext->gop_size = 12;
videoCodecContext->max_b_frames = 1;
videoCodecContext->pix_fmt = videoCodec->pix_fmts[0];
videoCodecContext->codec_id = videoCodec->id;
videoCodecContext->codec_type = videoCodec->type;
videoCodecContext->time_base = new AVRational
{
    num = 1,
    den = 30
};

ffmpeg.av_opt_set(videoCodecContext->priv_data, "preset", "ultrafast");

I'm also tried setting the "movflags" option for avformat_write_header() via an AVDictionary, but then av_write_trailer() returns -2, cause the file to not finish writing.

I cannot figure out how to solve this problem. Videos generating using Windows Movie Maker stream perfectly.

I know this has something to do with mdat and mov positions.

Also, this appears to only happening in Google Chrome.


回答1:


OK, figured this out. I've been writing the video frames first and the audio frames afterwards. Instead, you have to write them side by side in order for faststart to actually work and allow the video to stream.

So, write a specific amount of audio and then determine if a video frame should be written by checking the timebases against the current writing indexes.

This example will show you how its done.

Also, to get the video and audio streams to have accurate PTS/DTS values, look at this question.



来源:https://stackoverflow.com/questions/38011263/streaming-video-c-using-ffmpeg-autogen-sends-multiple-data-requests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!