迫使IOS的GStreamer在框架之外使用ffmpeg库

时间:2014-04-24 02:23:09

标签: ios ffmpeg gstreamer

IOS的​​Gstreamer 1.0是在静态框架中提供的,构建框架的源代码大约为1.2g,这个框架非常庞大,并试图为您提供任何解码服务器方案。麻烦是它试图做很多,恕我直言,没有足够的想法被放入IOS端口。

这就是我们有一个应用程序使用GSTreamer avdec_h264插件显示UDP上的RTP流的问题。这很有效。最近我们被要求做一些特殊的录音功能,所以我们介绍了一个有自己版本的ffmpeg的api。 Gstreamer已将Libav编入框架。当我们将api放入禁用gst_IOS_RESTICTED_PLUGINS的应用程序时,当我们将GStreamer.framework引入类似于下面显示的应用程序代码时,代码运行正常,并且找不到协议错误。

问题是libav的内部版本似乎禁用了ffmpeg提供的所有协议。因为GSTreamer使用自己的基于ffmpeg管道协议的自定义AVIO回调。

根据Gstreamer的支持,这有点帮助

)使用您要使用的libav版本添加新配方,并在gst-libav-1.0中禁用内部libav的构建: configure_options =' - with-system-libav'

您可能需要注释掉这部分以防止libav打包在framewiork中,或者确保您的libav配方在正确的位置创建这些文件以将它们包含在框架中:

对于['libavcodec','libavformat','libavutil','libswscale']中的f <42>: 43为['。'','。''中的分机: 44 path = os.path.join('lib',f + ext) 45 self.files_plugins_codecs_restricted_devel.append(path)

2)更新libav子模块gst-libav以使用您需要的正确版本。

https://bugs.freedesktop.org/show_bug.cgi?id=77399

第一种方法不起作用,即使在应用此错误报告导致的错误修复补丁后,该配方也会被覆盖。

我不知道如何做第二种方法。这是我想要帮助的。

有没有人使用GStreamer 1.0 for iOS

1)针对ffmpeg静态库(.a)的框架集的外部构建了get-libav插件

2)构建内部libav以允许RTP,UDP和TCP协议,或使用FFPipe协议编写自定义AVIO回调。

3)只是设法让以下代码与GStreamer合作。

我不问很多问题,我使用ffmpeg,lib555和一些硬件解码器实现了各种编码器/解码器。但是这个GStreamer问题让我在很长一段时间内度过了不眠之夜。

AVFormatContext * avctx;
avctx = avformat_alloc_context();

av_register_all();
avformat_network_init();
avcodec_register_all();
avdevice_register_all();



// Set the RTSP Options
AVDictionary *opts = 0;

av_dict_set(&opts, "rtsp_transport", "udp", 0);


int err = 0;
err = avformat_open_input(&avctx, "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov", NULL, &opts);
av_dict_free(&opts);
if (err) {
    NSLog(@"Error: Could not open stream: %d", err);
    char errbuf[400];
    av_strerror(err,errbuf,400);
    NSLog(@"%s failed with error %s","avformat_open_input",errbuf);



}
else {
    NSLog(@"Opened stream");
}

err = avformat_find_stream_info(avctx, NULL);
if( err < 0)
{
    char errbuf[400];
    av_strerror(err,errbuf,400);
    NSLog(@"%s failed with error %s","avformat_find_stream_info",errbuf);
    return ;
}else {
     NSLog(@"found stream info");
}

}

0 个答案:

没有答案