我正在编写客户端 - 服务器系统,使用FFMPEG库将H.264流解析为服务器端的NAL单元,然后使用信道编码通过网络将它们发送到客户端,我的应用程序必须能够播放视频
问题是如何在我的应用程序中播放收到的AVPackets(NAL单元)作为视频流。 我发现this tutorial很有用,并将其用作服务器端和客户端的基础。
一些示例代码或资源与播放视频不是来自文件,而是来自使用FFMPEG库的程序内的数据非常有帮助。
我确信收到的信息足以播放视频,因为我试图将收到的数据保存为.h264或.mp4文件,它可以由VLC播放器播放。
答案 0 :(得分:2)
我从您的问题中了解到,您拥有AVPackets并希望播放视频。实际上这是两个问题; 1.解码你的数据包,以及2.播放视频。
要使用FFmpeg对数据包进行解码,您应该查看AVPacket,AVCodecContext和avcodec_decode_video2的文档以获取一些想法;一般的想法是,你想要做一些事情(只是在浏览器中写下这个,并带着一点点盐):
//the context, set this appropriately based on your video. See the above links for the documentation
AVCodecContext *decoder_context;
std::vector<AVPacket> packets; //assume this has your packets
...
AVFrame *decoded_frame = av_frame_alloc();
int ret = -1;
int got_frame = 0;
for(AVPacket packet : packets)
{
avcodec_get_frame_defaults(frame);
ret = avcodec_decode_video2(decoder_context, decoded_frame, &got_frame, &packet);
if (ret <= 0) {
//had an error decoding the current packet or couldn't decode the packet
break;
}
if(got_frame)
{
//send to whatever video player queue you're using/do whatever with the frame
...
}
got_frame = 0;
av_free_packet(&packet);
}
这是一个非常粗略的草图,但这是解决AVPackets问题的一般想法。至于你播放视频的问题,你有很多选择,这可能更多地取决于你的客户。您要问的是一个非常大的问题,我建议您熟悉FFmpeg文档和the FFmpeg site提供的示例。希望有意义