Adobe-Runtime-Support icon indicating copy to clipboard operation
Adobe-Runtime-Support copied to clipboard

Crackling sound on `NetStream` stop

Open itlancer opened this issue 3 months ago • 0 comments

Problem Description

NetStream stop via NetStream::close() or NetStream::dispose() cause sound crackling. May be under hood AIR should send some extra data at NetStream::close() or NetStream::dispose() to audio decoder to prevent such behavior.

Reproduced with multiple AIR versions, even with latest AIR 51.0.1.1 with multiple different platforms (Windows, macOS, Android, iOS) with different devices, applications and videos. Same issue in all cases. But with some audio devices (or audio drivers) and some videos/sound it not noticeable. There is no such issue using many other (non-AIR) video/audio applications, especially wich uses ffmpeg. Setting SoundTransform::volume to 0 just before NetStream::close() or NetStream::dispose() didn't help. Playing with NetStreamAppendBytesAction.END_SEQUENCE just before NetStream::close() or NetStream::dispose() didn't help. Didn't test with FLV videos. Didn't test with Sound.

Related issues: https://github.com/airsdk/Adobe-Runtime-Support/issues/1939 https://github.com/airsdk/Adobe-Runtime-Support/issues/224 https://github.com/airsdk/Adobe-Runtime-Support/issues/211 https://github.com/airsdk/Adobe-Runtime-Support/issues/202 https://github.com/airsdk/Adobe-Runtime-Support/issues/155 https://github.com/airsdk/Adobe-Runtime-Support/issues/15

Steps to Reproduce

Launch application with code below. It just play video with audio in a loop. Click anywhere on stage to restart video (it will be stopped and new one started). You need to click in a "correct" moment to hear crackling noticeable and clear. Please take a look at demonstration video below.

Application example with sources and video sample attached. netstream_stop_crackling_bug.zip

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.media.Video;
	import flash.events.NetStatusEvent;
	import flash.desktop.SystemIdleMode;
	import flash.filesystem.File;
	import flash.events.MouseEvent;
	
	public class NetStreamStopCracklingBug extends Sprite {
		private var nc:NetConnection;
		private var ns:NetStream;
		private var video:Video = new Video(640, 480);
		
		public function NetStreamStopCracklingBug() {
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			addChild(video);
			
			stage.addEventListener(MouseEvent.CLICK, click);
			
			restartVideo();
		}
		
		private function click(e:MouseEvent):void {
			trace("click");
			restartVideo();
		}
	
		private function restartVideo():void {
			if (ns != null){
				ns.removeEventListener(NetStatusEvent.NET_STATUS, nsHandler);
				
				//These two lines cause audio crackling
				ns.close();
				ns.dispose();
			}
			if (nc != null){
				nc.removeEventListener(NetStatusEvent.NET_STATUS, ncHandler);
				nc.close();
			}
			
			nc = new NetConnection();
			nc.addEventListener(NetStatusEvent.NET_STATUS, ncHandler);
			nc.connect(null);
		}
		
		private function ncHandler(e:NetStatusEvent):void {
			if (e.info.code == "NetConnection.Connect.Success"){
				ns = new NetStream(nc);
				ns.client = {onMetaData:getMeta};
				ns.addEventListener(NetStatusEvent.NET_STATUS, nsHandler);
				video.attachNetStream(ns);
				
				ns.play("video.mp4");
			}
		}

		private function nsHandler(e:NetStatusEvent):void {
			trace(e.info.code);
			if (e.info.code == "NetStream.Play.Stop"){
				ns.play("video.mp4");
			}
		}

		private function getMeta(mdata:Object):void { }
		
	}
}

Actual Result: Audio crackling at video restart (NetStream::close() or NetStream::dispose() call). Video demonstration:

https://github.com/airsdk/Adobe-Runtime-Support/assets/10899066/342a0636-a2b2-48ca-82f5-a55544d32998

Expected Result: No audio crackling at video restart (or stop).

Known Workarounds

none *Write your own native extension to play video.

itlancer avatar May 21 '24 12:05 itlancer