2013-04-10 83 views
0

我正在编写客户机 - 服务器系统,它使用FFMPEG库将H.264流解析为服务器端的NAL单元,然后使用通道编码将它们通过网络发送到客户端,我的应用程序必须能够播放视频。如何使用FFMPEG播放存储为视频的NAL单元的H.264流AVPackets

问题是如何在我的应用程序中播放收到的AVPackets(NAL单元)作为视频流。 我发现this tutorial很有用,并将它用作服务器和客户端的基础。

一些与播放视频有关的示例代码或资源不是来自文件,而是来自使用FFMPEG库的程序内数据,这将非常有帮助。

我确定收到的信息足以播放视频,因为我试图将收到的数据保存为.h264或.mp4文件,并且可以由VLC播放器播放。

回答

2

我从你的问题中了解到,你有AVPackets并想播放视频。实际上这是两个问题; 1.解码你的数据包,和2.播放视频。

对于使用FFmpeg解码数据包,您应该查看AVPacket,AVCodecContextavcodec_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提供的示例。希望有道理

+0

感谢您的回答,我会花时间更深入地调查和理解FFmpeg。 – Sapphire 2013-04-17 06:21:47