Asterisk media

From 탱이의 잡동사니
Jump to: navigation, search


Asterisk media caching 내용 정리.


Asterisk 에서는 Asterisk-13 에서 소개된 내용 중 하나는 Media 를 URI 로 받아서 바로 play 할 수 있는 내용이었다. 그리고, Asterisk-14 에서는 캐싱(Caching)까지 가능하도록 되었다.

하지만 몇가지 특징과 제한점이 있다.


Asterisk 에서는 파일의 Extension 을 이용하여 파일의 타입을 확인하지 않고, 파일을 열어서 직접 포멧을 확인하는 방식을 사용해 왔다. 하지만 URI 를 통해 Media 를 제공할 경우, 반드시 파일의 확장자(Extension)가 있어야 한다.

URI Scheme

HTTP 혹은 HTTPS 모두 지원이 가능하다.


Media(sound) 가 한번 전송이 되고나면 해당 내용은 local server 에 캐싱된다. 캐싱 및 캐싱된 이후의 관리는 전적으로 standard http 규칙을 따른다. 일반적으로 다음과 같이 작동한다.

  • If a Cache-Control header is included, Asterisk will obey whatever rules it specifies. In particular, the following should be checked.
If no-cache is specified, the resulting file is marked as always 'dirty' - that is, we have to always retrieve a new resource from the server.
If no-store is specified, Asterisk must attempt to purge the information before Asterisk shutdown and will always retrieve the resource from the server.
s-maxage or max-age : Mark the file as 'dirty' after so many seconds.
  • If the cached resource is 'dirty', look at the E-Tag header on the remote resource and compare it to the local E-Tag. If the two are different, retrieve the resource and update the entry in the cache. If the cached resource was retrieved with no-store, then we always retrieve the full resource.

일단 캐싱요청이 들어오면 파일을 다운로드(curl lib 를 사용한다)한 후

요청하는 내용과 캐싱된 내용이 같은 내용인지 아닌지를 판별하는 방법은 제공된 URI 와 캐싱된 미디어의 URI 를 비교하여 확인한다.

	/* First, retrieve from the ao2 cache here. If we find a bucket_file
	 * matching the requested URI, ask the appropriate backend if it is
	 * stale. If not; return it.
	bucket_file = ao2_find(media_cache, uri, OBJ_SEARCH_KEY | OBJ_NOLOCK);
	if (bucket_file) {
		if (!ast_bucket_file_is_stale(bucket_file)
			&& ast_file_is_readable(bucket_file->path)) {
			ast_copy_string(file_path, bucket_file->path, len);
			if ((ext = strrchr(file_path, '.'))) {
				*ext = '\0';
			ao2_ref(bucket_file, -1);
			ast_debug(5, "Returning media at local file: %s\n", file_path);
			return 0;
		/* Stale! Remove the item completely, as we're going to replace it next */
		ao2_unlink_flags(media_cache, bucket_file, OBJ_NOLOCK);
		ao2_ref(bucket_file, -1);

See also