Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS上捕获/分割视频并通过HLS重新加入会导致音频丢失_Ios_Video Streaming_Http Live Streaming - Fatal编程技术网

在iOS上捕获/分割视频并通过HLS重新加入会导致音频丢失

在iOS上捕获/分割视频并通过HLS重新加入会导致音频丢失,ios,video-streaming,http-live-streaming,Ios,Video Streaming,Http Live Streaming,我正在尝试在iPhone5上捕获视频,以便实时上传和HLS流媒体。我正在设备上生成视频(尚未上传到服务器)。就像上面的这些链接一样,我已经拼凑了一些代码,每五秒钟就关闭一次AssetWriter 现在在开发过程中,我只是将文件保存到本地设备,并通过XCode Organizer将其取出。然后,我运行苹果的mediafilesegmenter,将它们简单地转换为MPEG2-TS(它们已经不足10秒了,所以没有实际的分段发生——我假设它们只是转换为TS)。我通过编辑在此过程中创建的各种索引

我正在尝试在iPhone5上捕获视频,以便实时上传和HLS流媒体。我正在设备上生成视频(尚未上传到服务器)。就像上面的这些链接一样,我已经拼凑了一些代码,每五秒钟就关闭一次AssetWriter

现在在开发过程中,我只是将文件保存到本地设备,并通过XCode Organizer将其取出。然后,我运行苹果的mediafilesegmenter,将它们简单地转换为MPEG2-TS(它们已经不足10秒了,所以没有实际的分段发生——我假设它们只是转换为TS)。我通过编辑在此过程中创建的各种索引文件来构建m3u8(目前也是手动创建的)

当我将这些资源放在服务器上进行测试时,它们大部分都是正确的流式传输,但我可以判断何时有段切换,因为音频会短暂下降(可能视频也会下降,但我不能确定-看起来还可以)。对于从单个输入文件分割的典型HLS流,这显然不会发生。我不知道这是什么原因造成的

您可以在iPhone上打开my HLS stream(5秒后,您可以听到音频下降,10秒左右再次下降)

在我的创作过程中(无论是在设备上还是在后处理过程中)会不会发生什么导致短暂的音频下降?我不认为在AssetWriter关闭期间我会删除任何sampleBuffer(参见代码)


我认为您的ts文件不会在同一时间线上创建。在ts文件中是数据包的表示时间戳,如果在每个段上创建新的ts,则可能存在不连续性

可能的工作方式是将记录的片段连接在一起,以便在同一时间线中为新零件添加时间戳。然后分段应该正常工作,并且在生成的流中分段过渡应该平滑

我认为您需要一个始终保持前一段最后一部分的流程,以便时间戳始终同步。

您可以尝试在m3u8中的每个段之间插入一个“EXT-X”不连续,但我怀疑这是否可行。这里有很多事情可能会出错

假设您的音频采样频率为44100kHz,则每22微秒会有一个新的音频采样。在关闭和重新打开文件的过程中,您肯定会丢失样本。如果连接最终波形,由于这种损失,它将以比实时稍快的速度播放。实际上,这可能不是一个问题

正如@vipw所说,您还将遇到时间戳问题。每次启动新mp4时,都是从时间戳0开始。因此,玩家会感到困惑,因为时间戳会不断重置

另外,是传输流格式。TS将每个帧封装为“流”。HLS通常有4个(PAT、PMT、音频和视频),每个流被分成188字节的数据包和4字节的报头。报头有一个每流4位的连续性计数器,它在溢出时环绕。因此,在每一个mp4上运行mediafilesegmenter,通过将连续性计数器重置回零,您正在断开每个段的流


您需要一个工具,该工具将接受mp4并创建流式输出,以维护/重写时间戳(PTS、DTS、CTS)以及连续性计数器。

移动数据包

我们在使用旧版本的ffmpeg pts过滤器来移动数据包时遇到了问题。最近的ffmpeg1和ffmpeg2支持MPEGT的时间偏移

下面是一个ffmpeg调用的示例,注意-t表示持续时间,而-initial_表示命令末尾的移位时间(继续向右滚动…) 这是一段10秒的班次

/opt/ffmpeg -i /tmp/cameo/58527/6fc2fa1a7418bf9d4aa90aa384d0eef2244631e8 -threads 0 -ss 10 -i /tmp/cameo/58527/79e684d793e209ebc9b12a5ad82298cb5e94cb54 -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 100000 -bt 100000 -bufsize 100000 -maxrate 100000 -r 12 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/100K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 200000 -bt 200000 -bufsize 200000 -maxrate 200000 -r 12 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/200K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 364000 -bt 364000 -bufsize 364000 -maxrate 364000 -r 24 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/364K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 664000 -bt 664000 -bufsize 664000 -maxrate 664000 -r 24 -s 480x270 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/664K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 23 -profile:v baseline -x264opts level=3.1:keyint_min=24:keyint=24:scenecut=0 -b:v 1264000 -bt 1264000 -bufsize 1264000 -maxrate 1264000 -r 24 -s 640x360 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/1264K%01d.ts
还有我在github上更新的版本,但它只是经过了合理的测试,仅用于视频MPEGT。AV仍然会导致一些问题(我不确定哪种类型的数据包应该被转换为新值—第一个视频或第一个音频数据包,选择了第一个视频数据包)。此外,正如您在中所指出的,当您遇到它时,某些媒体可能会出现问题


如果我有更多的时间在我的手中,我想调试你的具体情况,并改进C++移位器。我希望上面的ffmpeg示例能够帮助您的http实时流媒体示例正常工作,我们已经经历了流媒体的麻烦。我们目前正在研究一种由移位片段产生的音频流行音乐。修复方法是在分割成分段流之前收集所有源媒体(我们可以在完成视频时这样做,但在迭代构建过程中会减慢速度)。

我想知道这些,但对mp4文件格式了解不够,不知道如何确认或修复它。我可以说,我获取了原始mp4输出文件,并将它们与ffmpeg连接起来,以查看输出是什么样的,但仍然存在辍学。所以,即使我一直在写文件,每次一个AssetWriter开始一个新文件时似乎都会发生一些事情。你有没有让ffmpeg重新写时间戳?我一直在尝试setpts和asetpts,但它似乎并没有覆盖现有的pts,相反,它似乎在添加更多。ffmpeg cli很难,我不确定我是否使用了正确的命令。我目前使用的是:“ffmpeg-I input.ts-vf'setpts=572250+PTS'output.ts”input.ts在视频流中前后有119个数据包。不知道发生了什么。谢谢,是的,这开始有意义了。基本上,每次我启动一个新的AVAssetWriter时,它都必须确保文件是完全独立的,因此,在您看来,一切都是重置的。跟踪和重置时间戳是有意义的,我来看看。实际上我甚至不需要不连续性标签,它似乎在没有
/opt/ffmpeg -i /tmp/cameo/58527/6fc2fa1a7418bf9d4aa90aa384d0eef2244631e8 -threads 0 -ss 10 -i /tmp/cameo/58527/79e684d793e209ebc9b12a5ad82298cb5e94cb54 -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 100000 -bt 100000 -bufsize 100000 -maxrate 100000 -r 12 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/100K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 200000 -bt 200000 -bufsize 200000 -maxrate 200000 -r 12 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/200K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 364000 -bt 364000 -bufsize 364000 -maxrate 364000 -r 24 -s 320x180 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/364K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 28 -profile:v baseline -x264opts level=3:keyint_min=24:keyint=24:scenecut=0 -b:v 664000 -bt 664000 -bufsize 664000 -maxrate 664000 -r 24 -s 480x270 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/664K%01d.ts -codec:v libx264 -pix_fmt yuv420p -preset veryfast -strict -2 -bsf:v h264_mp4toannexb -flags -global_header -crf 23 -profile:v baseline -x264opts level=3.1:keyint_min=24:keyint=24:scenecut=0 -b:v 1264000 -bt 1264000 -bufsize 1264000 -maxrate 1264000 -r 24 -s 640x360 -map 0:0 -map 1:0 -codec:a aac -strict -2 -b:a 64k -ab 64k -ac 2 -ar 44100 -t 9.958333333333334 -segment_time 10.958333333333334 -f segment -initial_offset 10 -segment_format mpegts -y /tmp/cameo/58527/1264K%01d.ts